টিপলের পরিবর্তে তালিকার আউটপুট সহ জিপ করুন


94

দুটি তালিকা থেকে তালিকাগুলির তালিকা তৈরির দ্রুত এবং সর্বাধিক মার্জিত উপায় কী?

আমার আছে

In [1]: a=[1,2,3,4,5,6]

In [2]: b=[7,8,9,10,11,12]

In [3]: zip(a,b)
Out[3]: [(1, 7), (2, 8), (3, 9), (4, 10), (5, 11), (6, 12)]

এবং আমি চাই

In [3]: some_method(a,b)
Out[3]: [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]

আমি জিপের পরিবর্তে মানচিত্রটি ব্যবহার করার বিষয়ে ভাবছিলাম, তবে প্রথম আর্গুমেন্ট হিসাবে কোনও মানসম্পন্ন গ্রন্থাগার আছে কিনা তা আমি জানি না।

আমি এটির জন্য আমার নিজস্ব ফাংশনটি ডিফ করতে পারি এবং মানচিত্রটি ব্যবহার করতে পারি, আমার প্রশ্নটি যদি ইতিমধ্যে কিছু বাস্তবায়িত হয়। না একটি উত্তর।


4
ঠিক আছে, আপনার কি সত্যিই তালিকাগুলি দরকার ? ফলাফল নিয়ে আপনি কী করতে যাচ্ছেন?
কার্ল নচেটেল

14
উদাহরণস্বরূপ স্কেলার হবে, যেখানে এই ফ্যাশনে অনেকবার ডেটা গুছিয়ে রাখতে হবে।
গণ্ডগোল_আরোস্টার

উত্তর:


101

যদি আপনি 2 টিরও বেশি তালিকাগুলি জিপ করছেন (বা এমনকি কেবল 2 টিও, সেই বিষয়ে), একটি পঠনযোগ্য উপায় হ'ল:

[list(a) for a in zip([1,2,3], [4,5,6], [7,8,9])]

এটি তালিকার বোধগম্য ব্যবহার করে তালিকার প্রতিটি উপাদানকে তালিকায় রূপান্তর করে (টিপলস)।


54

আপনার নিজের উত্তর প্রায় ছিল almost mapপরিবর্তে ব্যবহার করবেন না zipmap এবং ব্যবহার করুন zip

মার্জিত, কার্যকরী পদ্ধতির জন্য আপনি জিপ সহ মানচিত্রটি ব্যবহার করতে পারেন:

list(map(list, zip(a, b)))

zipটিপলগুলির একটি তালিকা প্রদান করে। তালিকার প্রতিটি tuple map(list, [...])কল listlist(map([...])মানচিত্রের অবজেক্টটিকে পাঠযোগ্য তালিকায় পরিণত করে।


অজগর 3 সংগ্রহের অপারেশন করার দুর্ভাগ্যজনক সিদ্ধান্তটি এখানে generatorডাবলের ব্যয় বহন করে list
স্টিফেনবোশ

15

আমি জিপ ফাংশনের কমনীয়তা পছন্দ করি, তবে অপারেটর মডিউলটিতে আইটেমজিটার () ফাংশনটি ব্যবহার করা অনেক দ্রুত বলে মনে হয়। এটি পরীক্ষা করার জন্য আমি একটি সাধারণ স্ক্রিপ্ট লিখেছিলাম:

import time
from operator import itemgetter

list1 = list()
list2 = list()
origlist = list()
for i in range (1,5000000):
        t = (i, 2*i)
        origlist.append(t)

print "Using zip"
starttime = time.time()
list1, list2 = map(list, zip(*origlist))
elapsed = time.time()-starttime
print elapsed

print "Using itemgetter"
starttime = time.time()
list1 = map(itemgetter(0),origlist)
list2 = map(itemgetter(1),origlist)
elapsed = time.time()-starttime
print elapsed

আমি জিপটি দ্রুত হবে বলে আশাবাদী, তবে আইটেমজিটার পদ্ধতিটি একটি দীর্ঘ শট দ্বারা জিতেছে:

Using zip
6.1550450325
Using itemgetter
0.768098831177

4
এটি ওপি যা করার চেষ্টা করছে তার একটি স্থানান্তর ose আপনি কি আপনার পোস্টটি প্রতিফলিত করতে আপডেট করতে পারবেন? অর্থাৎ ওপি দুটি তালিকাকে জোড়ের তালিকায় বা নির্বিচার সংখ্যায় রূপান্তর করছে is আপনি এক জোড়া তালিকার জোড়ায় একটি নির্বিচার সংখ্যার রূপান্তর করছেন।
ম্যাড পদার্থবিদ

এটি কোন অজগর সংস্করণ দিয়ে পরিমাপ করা হয়?
মোবার্গ

আমার মনে নেই, এটি দুই বছর আগে শেষ হয়েছিল, তবে সম্ভবত 2.6 বা 2.7। আমি ধারণা করি আপনি কোডটি অনুলিপি করতে পারেন এবং এটি নিজের সংস্করণ / প্ল্যাটফর্মে চেষ্টা করে দেখতে পারেন।
kslnet

4
অজগর 2 zipএকটি বাস্তব তালিকা তৈরি করে। এটি জিনিসগুলিকে ধীর করে দেয়। প্রতিস্থাপন করার চেষ্টা করুন zipসঙ্গে itertools.izipতারপর।
জিন-

পাইথন 3.5 তে, জিপটি 3.5 সেকেন্ড এবং আইটেমজিটারটি 0.10 সেকেন্ড সময় নেয়। তালিকা অনুধাবন যারা শখের জন্য, list1 = [x[0] for x in origlist]ঠিক পাশাপাশি কাজ করে list1 = map(itemgetter(0), origlist)
এলিয়াস স্ট্রেলে

3

আমি সাধারণত ল্যাম্বদা ব্যবহার পছন্দ করি না তবে ...

>>> a = [1, 2, 3, 4, 5]
>>> b = [6, 7, 8, 9, 10]
>>> c = lambda a, b: [list(c) for c in zip(a, b)]
>>> c(a, b)
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

আপনার যদি অতিরিক্ত গতির প্রয়োজন হয় তবে মানচিত্রটি কিছুটা দ্রুত:

>>> d = lambda a, b: map(list, zip(a, b))
>>> d(a, b)
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

তবে মানচিত্রটিকে অযৌক্তিক হিসাবে বিবেচনা করা হয় এবং এটি কেবল পারফরম্যান্স টিউনিংয়ের জন্য ব্যবহার করা উচিত।


4
lambdaএখানে কি যুক্ত করে ? কেউ কেবল কোনও ফাংশন কল করার পরিবর্তে অভিব্যক্তি লিখতে পারেন (এটি আসলে জটিল নয়), এমনকি যদি কেউ এর জন্য কোনও ফাংশন চায় তবে এটি ব্যথামুক্তভাবে দুটি লাইনে সংজ্ঞায়িত করা যায় (যদি আপনার ফেরতের চাবিটি ভেঙে যায় বা আপনি উন্মাদ হন) । mapঅন্যদিকে পুরোপুরি সূক্ষ্ম হয় যদি প্রথম যুক্তিটি একটি সরল ফাংশন হয় (এ এর বিপরীতে lambda)।

4
আচ্ছা তিনি একটি ফাংশন চেয়েছিলেন। তবে আমি সম্মতি জানাই - অতিরিক্ত লাইন প্রদানের চেয়ে সম্ভবত আরও ভাল। মানচিত্রের ক্ষেত্রে, আমি বিশ্বাস করি যে তালিকা বোধগম্যতা প্রায় সবসময় পরিষ্কার হয়।
Ceasar বাউটিস্তা

4
আমি সুপারিশ করবে mapওভার lambda। তাই map(list, zip(a,b))। তালিকান বোধগম্যতা কিছুটা পরিষ্কার হতে পারে তবে মানচিত্রটি দ্রুত হওয়া উচিত (অনির্ধারিত)
ইন্সপেক্টর

আমি আবার বলতে চাইছি, যদি ওপিকে গতির প্রয়োজন হয় তবে মানচিত্রটিই যাওয়ার উপায়। তবে সাধারণভাবে এবং পাইথন বিশেষত গতির চেয়ে বেশি পঠনযোগ্যতার উপর জোর দেয় (অন্যথায় আপনি অকাল অপটিমাইজেশনে ডুবে যান)।
সিসার বাউটিস্তা

3

এ কেমন?

>>> def list_(*args): return list(args)

>>> map(list_, range(5), range(9,4,-1))
[[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]

বা আরও ভাল:

>>> def zip_(*args): return map(list_, *args)
>>> zip_(range(5), range(9,4,-1))
[[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]

এটি আমার কাছে বাকীগুলির চেয়ে ভাল উত্তর বলে মনে হচ্ছে কারণ এখানে আমরা জিপ না করে সরাসরি একটি তালিকা তৈরি করে একটি পদক্ষেপ হ্রাস করছি। দুর্দান্ত
অক্ষয় হাজারী

2

অদ্ভুত ব্যবহার

কমনীয়তার সংজ্ঞাটি বেশ প্রশ্নবিদ্ধ হতে পারে তবে আপনি যদি numpyঅ্যারে তৈরির সাথে কাজ করে থাকেন এবং তালিকাতে রূপান্তরকরণের সাথে (যদি প্রয়োজন হয় ...) mapফাংশন বা তালিকার বোধগম্যতা ব্যবহার করে তুলনামূলক দক্ষ না হয়েও খুব ব্যবহারিক হতে পারেন ।

import numpy as np 
a = b = range(10)
zipped = zip(a,b)
result = np.array(zipped).tolist()
Out: [[0, 0],
 [1, 1],
 [2, 2],
 [3, 3],
 [4, 4],
 [5, 5],
 [6, 6],
 [7, 7],
 [8, 8],
 [9, 9]]

অন্যথায় zipফাংশনটি এড়িয়ে যাওয়া আপনি সরাসরি ব্যবহার করতে পারেন np.dstack:

np.dstack((a,b))[0].tolist()

1

তালিকা অনুধাবন আমার ধারণা খুব সহজ সমাধান হবে solution

a=[1,2,3,4,5,6]

b=[7,8,9,10,11,12]

x = [[i, j] for i, j in zip(a,b)]

print(x)

output : [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.