একটি তালিকার প্রতিটি জোড় উপাদানের উপর অপারেশন


104

পাইথন ব্যবহার করে, আমি একটি তালিকার প্রতিটি সম্ভাব্য জোড় তুলনা করতে চাই।

ধরুন আমার আছে

my_list = [1,2,3,4]

আমি তালিকা থেকে 2 টি উপাদানের প্রতিটি সংমিশ্রণে একটি অপারেশন করতে চাই (আসুন একে foo বলি)।

চূড়ান্ত ফলাফল হিসাবে একই হতে হবে

foo(1,1)
foo(1,2)
...
foo(4,3)
foo(4,4)

আমার প্রথম চিন্তাটি ছিল ম্যানুয়ালি তালিকার মধ্য দিয়ে দু'বার পুনরাবৃত্তি করা, তবে এটি খুব অজগর বলে মনে হচ্ছে না।

উত্তর:


244

পরীক্ষা করে দেখুন product()যে itertoolsমডিউল। এটি আপনি যা বর্ণনা করেছেন ঠিক তা করে।

import itertools

my_list = [1,2,3,4]
for pair in itertools.product(my_list, repeat=2):
    foo(*pair)

এটি সমান:

my_list = [1,2,3,4]
for x in my_list:
    for y in my_list:
        foo(x, y)

সম্পাদনা করুন: দুটি খুব অনুরূপ ফাংশন এছাড়াও রয়েছে, permutations()এবং combinations()। তারা কীভাবে পৃথক হয় তা চিত্রিত করার জন্য:

product() সমস্ত অনুলিপি সহ উপাদানগুলির প্রতিটি সম্ভাব্য জুটি তৈরি করে:

1,1  1,2  1,3  1,4
2,1  2,2  2,3  2,4
3,1  3,2  3,3  3,4
4,1  4,2  4,3  4,4

permutations()x,xসদৃশগুলি অপসারণ করে প্রতিটি অনন্য জোড়া উপাদানের সমস্ত অনন্য অর্ডার তৈরি করে :

 .   1,2  1,3  1,4
2,1   .   2,3  2,4
3,1  3,2   .   3,4
4,1  4,2  4,3   .

অবশেষে, combinations()কেবল অভিধানের ক্রমে প্রতিটি অনন্য জোড়া তৈরি করে:

 .   1,2  1,3  1,4
 .    .   2,3  2,4
 .    .    .   3,4
 .    .    .    .

এই ফাংশনগুলির তিনটিই পাইথন ২.6 এ প্রবর্তিত হয়েছিল।


4
অদ্ভুত, যখন আমি itertools.pr Prodct (my_list, 2) চালাই, তখন এটি অভিযোগ করে যে কোনটি কল করা যায় না। আমি এটিকে পরিবর্তন করে একবারে কাজ করে: itertools.product (my_list, পুনরাবৃত্তি = 2)
ওজ্রাক

দ্রষ্টব্য যে পাইথন ২.6 এ itertools.pr Prodct () নতুন।
মাইক মাজুর

কেবল উত্তরসূরির জন্য, আমি উল্লেখ করব যে itertools.combitions মূল উদাহরণে foo (1,1) বা foo (4,4) লাইন তৈরি করে না।
কাইলোটন

4
এছাড়াও কম্বিনেশন রয়েছে_সহ_প্লেসমেন্ট ()। সংমিশ্রণগুলি () পছন্দ করে তবে ত্রিভুজ সহ (চিত্রগুলির সাথে মিল রেখে)।
জিগল

4
অলসতার জন্য: উপরোক্ত ফলাফলগুলি পেতে permutations()এবং combinations()ব্যবহারের r=2পরিবর্তে repeat=2উদাহরণ হিসাবে ব্যবহারের জন্যproduct()
রব

16

আমারও অনুরূপ সমস্যা হয়েছিল এবং সমাধানটি এখানে পেয়েছি । এটি কোনও মডিউল আমদানি না করেই কাজ করে।

মনে হয় একটি তালিকা:

people = ["Lisa","Pam","Phil","John"]

একটি সরলিকৃত এক-লাইন সমাধান এর মতো দেখায়।

সদৃশ সহ সমস্ত সম্ভাব্য জোড়া :

result = [foo(p1, p2) for p1 in people for p2 in people]

সদৃশ ব্যতীত সমস্ত সম্ভাব্য জোড়া :

result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]

অনন্য যুগল , যেখানে ক্রমটি অপ্রাসঙ্গিক:

result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]

আপনি পরিচালনা করতে না চান তবে কেবল জোড়া পেতে, ফাংশনটি সরিয়ে fooএবং কেবল একটি টিউপল ব্যবহার করা যথেষ্ট।

সদৃশ সহ সমস্ত সম্ভাব্য জোড়া :

list_of_pairs = [(p1, p2) for p1 in people for p2 in people]

ফলাফল:

('Lisa', 'Lisa')
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Pam')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'Phil')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
('John', 'John')

সদৃশ ব্যতীত সমস্ত সম্ভাব্য জোড়া :

list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]

ফলাফল:

('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')

অনন্য যুগল , যেখানে ক্রমটি অপ্রাসঙ্গিক:

list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]

ফলাফল:

('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')

সম্পাদনা করুন: এই সমাধানটি সহজ করার জন্য পুনরায় কাজ করার পরে, আমি বুঝতে পেরেছিলাম যে এটি অ্যাডাম রোজেনফিল্ডের চেয়ে একই পদ্ধতি। আমি আশা করি বৃহত্তর ব্যাখ্যা কিছুটিকে এটি আরও ভালভাবে বুঝতে সাহায্য করে।


4
আমি একটি লাইব্রেরি আমদানি করতে অনেক বেশি পছন্দ করি, অনেক ক্লিনার!
sudo-nim

4
ইটারটুলস পাইথনের অংশ। এটি বাহ্যিক গ্রন্থাগার নয়।
গুইসিম 5'19

3

আপনি যদি কেবল কোনও ফাংশন কল করে থাকেন তবে আপনি এর চেয়ে আরও ভাল কিছু করতে পারবেন না:

for i in my_list:
    for j in my_list:
        foo(i, j)

আপনি যদি ফাংশনটি কল করার ফলাফলগুলির একটি তালিকা সংগ্রহ করতে চান তবে আপনি এটি করতে পারেন:

[foo(i, j) for i in my_list for j in my_list]

যা আপনাকে foo(i, j)প্রতিটি সম্ভাব্য জোড় প্রয়োগের ফলাফলের তালিকা ফিরিয়ে দেবে (i, j)


0
my_list = [1,2,3,4]

pairs=[[x,y] for x in my_list for y in my_list]
print (pairs)

এই কোড সমস্যা সমাধানের পারে যদিও, একটি ভাল উত্তর এছাড়াও একটি ব্যাখ্যা প্রয়োজন কি কোড করে এবং কিভাবে এটা সমস্যা solves।
বিডিএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.