টিপলগুলির তালিকায় তালিকাগুলি কীভাবে মার্জ করবেন?


297

নিম্নলিখিতটি অর্জনের জন্য পাইথোনিক পদ্ধতি কী?

# Original lists:

list_a = [1, 2, 3, 4]
list_b = [5, 6, 7, 8]

# List of tuples from 'list_a' and 'list_b':

list_c = [(1,5), (2,6), (3,7), (4,8)]

প্রত্যেক সদস্যের সদস্য list_cএকটি টুপল, যার প্রথম সদস্যের list_aএবং দ্বিতীয় সদস্যটি থেকে list_b

উত্তর:


442

পাইথন 2 এ:

>>> list_a = [1, 2, 3, 4]
>>> list_b = [5, 6, 7, 8]
>>> zip(list_a, list_b)
[(1, 5), (2, 6), (3, 7), (4, 8)]

পাইথন 3 এ:

>>> list_a = [1, 2, 3, 4]
>>> list_b = [5, 6, 7, 8]
>>> list(zip(list_a, list_b))
[(1, 5), (2, 6), (3, 7), (4, 8)]

77
আপনাকে জানতে হবে যে জিপ ফাংশনটি সংক্ষিপ্ত তালিকার শেষে বন্ধ হয়ে যায়, যা আপনি যা চান তা সর্বদা নাও হতে পারে। itertoolsমডিউল একটি সংজ্ঞায়িত zip_longest()পদ্ধতি যা দীর্ঘতম তালিকার শেষে স্টপ, কিছু আপনি একটি প্যারামিটার হিসাবে প্রদান সঙ্গে অনুপস্থিত মানের ভর্তি।
এড্রিয়েন প্লিসন

5
@ অ্যাড্রিয়েন: আপনার প্রযোজ্য মন্তব্যের জন্য চিয়ার্স। পাইথন 2.x এর জন্য s/zip_longest()/izip_longest()। পাইথন 3.x টু নামকরণ zip_longest()
যান্ত্রিক_মাট

আমি কি জিপ কমান্ড ব্যবহার করে [(1,5), (1,6), (1,7), (1,8), (2,5), (2,6), তৈরি করতে পারি?
মোনা জালাল

3
@ মোনাজালাল: না, এটি জুটি বাঁধছে না, এটি তালিকার পণ্য তৈরি করছে । itertools.product()এটা করে
মার্টিজান পিটারস

2
নোট করুন, কমপক্ষে পাইথন .6. z জিপ কোনও তালিকা ফিরিয়ে দেয় না। তার পরিবর্তে আপনার তালিকার প্রয়োজন (জিপ (তালিকা_এ, তালিকা_ বি))
সুপামি

141

পাইথনে 3.0.০ জিপ একটি জিপ অবজেক্ট দেয়। আপনি কল করে একটি তালিকা পেতে পারেন list(zip(a, b))


3
এটি তুচ্ছ হতে পারে তবে সতর্ক হতে হবে যে সরাসরি লুপের জন্য এটি ব্যবহার করা আপনাকে এমন একটি জেনারেটর দেয় যা এটি একবার ব্যবহার করার পরে নিঃশেষ হয়ে যাবে। আপনি যদি এটিকে প্রায়শই ব্যবহার করতে চান তবে কোনও ভেরিয়েবলে সংরক্ষণ করুন
হাকাশিন

13

আপনি মানচিত্র লাম্বদা ব্যবহার করতে পারেন

a = [2,3,4]
b = [5,6,7]
c = map(lambda x,y:(x,y),a,b)

লম্বা মূল তালিকার মিল না থাকলে এটিও কাজ করবে


1
ল্যাম্বডা কেন ব্যবহার করবেন? map(None, a,b)
প্যাডেরিক কানিংহাম

আমার কেবল অজগর 3.5 তে অ্যাক্সেস আছে।
ডার্ক নাইট

3
যদি আপনি পাইথন 3 ব্যবহার করে থাকেন তবে সি একটি মানচিত্রের অবজেক্টের তালিকা নয়, ল্যাম্বডা ব্যবহার করা কেবল জিপিংয়ের চেয়ে অনেক কম দক্ষ হতে চলেছে, যদি আপনার দৈর্ঘ্যের বিভিন্ন তালিকা থাকে এবং এটি পরিচালনা করতে চান তবে আপনি ব্যবহার করতে পারবেন izip_longest / zip_longest
কানিংহাম


6

আমি নিশ্চিত নই যে এটি একটি অজগর উপায় বা না তবে এটি উভয় তালিকার একই সংখ্যার উপাদানগুলির মত থাকলে এটি সহজ বলে মনে হচ্ছে:

list_a = [1, 2, 3, 4]

list_b = [5, 6, 7, 8]

list_c=[(list_a[i],list_b[i]) for i in range(0,len(list_a))]

5

আমি জানি এটি একটি পুরানো প্রশ্ন এবং ইতিমধ্যে উত্তর দেওয়া হয়েছিল, তবে কিছু কারণে, আমি এখনও এই বিকল্প সমাধানটি পোস্ট করতে চাই। আমি জানি যে কোন বিল্ট-ইন ফাংশনটি আপনার "জাদু" প্রয়োজন তা কেবল খুঁজে পাওয়া সহজ তবে আপনি নিজের দ্বারা এটি করতে পারবেন তা জানার ক্ষতি হয় না।

>>> list_1 = ['Ace', 'King']
>>> list_2 = ['Spades', 'Clubs', 'Diamonds']
>>> deck = []
>>> for i in range(max((len(list_1),len(list_2)))):
        while True:
            try:
                card = (list_1[i],list_2[i])
            except IndexError:
                if len(list_1)>len(list_2):
                    list_2.append('')
                    card = (list_1[i],list_2[i])
                elif len(list_1)<len(list_2):
                    list_1.append('')
                    card = (list_1[i], list_2[i])
                continue
            deck.append(card)
            break
>>>
>>> #and the result should be:
>>> print deck
>>> [('Ace', 'Spades'), ('King', 'Clubs'), ('', 'Diamonds')]

2
ইনপুট তালিকার একটিতে পরিবর্তন (যদি তারা দৈর্ঘ্যে পৃথক হয়) কোনও দুর্দান্ত পার্শ্ব-প্রতিক্রিয়া নয়। এছাড়াও, দুই বরাদ্দকরণ cardমধ্যে if-elifপ্রয়োজন হয় না, কেন যে আপনি continue। (আসলে, continueতালিকাগুলি ছাড়াই আপনাকে তালিকা পরিবর্তন করতে হবে না: পূর্বের উল্লিখিত উভয় card = (list_1[i], '')card = ('', list_2[1])
কার্যাদিই

5

আপনি সমস্যার বিবৃতিতে যে আউটপুটটি দেখিয়েছেন তা টিপল নয় তবে তালিকা

list_c = [(1,5), (2,6), (3,7), (4,8)]

অনুসন্ধানের জন্য

type(list_c)

আপনি list_a এবং list_b এর বাইরে ফল হিসাবে ফলাফল চান তা বিবেচনা করে, করুন

tuple(zip(list_a,list_b)) 

আমার দৃষ্টিকোণ থেকে, দেখে মনে হচ্ছে আমি যা খুঁজছি এবং উভয়ের জন্যই (সূচি এবং টিপল) ভাল কাজ করব। কারণ আপনি যখন মুদ্রণটি ব্যবহার করবেন , আপনি সঠিক মান দেখতে পাবেন (যেমনটি প্রত্যাশিত এবং @cyborg এবং @Lodewijk দ্বারা উল্লিখিত) এবং অবজেক্টের সাথে সম্পর্কিত যেমন:: <map object at 0x000001F266DCE5C0>বা <zip object at 0x000002629D204C88>। কমপক্ষে, মানচিত্র এবং জিপ (একা) সম্পর্কে সমাধানটি আমার কাছে অসম্পূর্ণ (বা খুব জটিল) বলে মনে হচ্ছে।
ওয়াগনার_সফিসি

1
প্রশ্নটি বলে যে তারা টিউপসগুলির একটি তালিকা চাই না টিউপসগুলির একটি টিপল নয়।
goryh

1

ব্যবহার না করে একটি বিকল্প zip:

list_c = [(p1, p2) for idx1, p1 in enumerate(list_a) for idx2, p2 in enumerate(list_b) if idx1==idx2]

যদি কেউ কেবল 1 ম সাথে প্রথম তৃতীয়, 2 য় 2 য় সাথে পেতে চায় না ... তবে 2 তালিকার সমস্ত সম্ভাব্য সংমিশ্রণটি সম্পন্ন করতে হবে with

list_d = [(p1, p2) for p1 in list_a for p2 in list_b]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.