দুটি তালিকার মধ্যে সংমিশ্রণ?


185

এটি একটি সময় হয়ে গেছে এবং আমি তৈরি করার চেষ্টা করছি একটি অ্যালগরিদমের চারপাশে আমার মাথা জড়ান সমস্যা। মূলত, আমার দুটি তালিকা রয়েছে এবং দুটি তালিকার সমস্ত সংমিশ্রণ পেতে চাই।

আমি এটি সঠিক ব্যাখ্যা করছি না তাই এখানে একটি উদাহরণ দেওয়া আছে।

name = 'a', 'b'
number = 1, 2

এই ক্ষেত্রে আউটপুট হবে:

1.  A1 B2
2.  B1 A2

জটিল অংশটি হ'ল আমার কাছে "নাম" ভেরিয়েবলের "নাম" ভেরিয়েবলের আইটেমের চেয়ে আরও বেশি আইটেম থাকতে পারে (নামটি সর্বদা নামের ভেরিয়েবলের সমান বা কম হবে)।

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

আমি সেরা প্রোগ্রামার নই তবে আমি মনে করি যে এটি অর্জনের জন্য যদি কেউ আমাকে যুক্তি / আলগোরিয়্যথকে স্পষ্ট করতে সহায়তা করতে পারে তবে আমি এটি একটি শট দিতে পারি। সুতরাং আমি লুপগুলির জন্য নেস্টেড এ আটকে গিয়েছি।

হালনাগাদ:

এখানে 3 ভেরিয়েবল এবং 2 সংখ্যা সহ আউটপুট রয়েছে:

name = 'a', 'b', 'c'
number = 1, 2

আউটপুট:

1.  A1 B2
2.  B1 A2
3.  A1 C2
4.  C1 A2
5.  B1 C2
6.  C1 B2


1
@ dm03514 আমি এটি দেখেছি এবং এরটুলগুলি ব্যবহার করে কিছুটা অনুরূপ লক্ষ্যের উদাহরণ পেয়েছি তবে আমি পাইথনে প্রোটোটাইপ করছি তবে অন্য ভাষায় চূড়ান্ত কোডটি লিখব তাই আমি অন্য কোনও উপায়ে ব্যবহারযোগ্য না এমন কোনও সরঞ্জাম ব্যবহার করতে চাই না।
user1735075

1
আপনি যা জিজ্ঞাসা করছেন তা বাস্তবে বোঝায় না। প্রথম তালিকায় যদি এ, বি, সি থাকে এবং দ্বিতীয়টিতে ১,২ থাকে তবে আপনি কোন ফলাফলের প্রত্যাশা করবেন? এটি দেওয়া যেতে পারে যদি আপনি যে উদাহরণ দিয়েছিলেন তার একটি চিঠির 4 টি আলাদা ফলাফল এবং প্রত্যেকটির একটি করে সংখ্যার (এ 1, এ 2, বি 1, বি 2) থাকে, বা উভয় তালিকার একই আকার থাকতে পারে।
ইন্টারজয়

1
আমি আন্তজয়ের সাথে একমত দয়া করে অ-সমমানের আকারের ক্ষেত্রে ফলাফলটি উল্লেখ করুন, অন্যথায় সাধারণ সমাধান সরবরাহ করা সম্ভব নয়।
বাকুরিউ

সবাইকে হাই, আমি 3 টি নাম এবং 2 নম্বর দিয়ে আউটপুটটি দেখানোর জন্য উত্তরটি আপডেট করেছি..আমি ভেবেছিলাম আমি এটি ভালভাবে ব্যাখ্যা করেছি, কেন জানি ডাউনটা নেই।
ব্যবহারকারী1735075

উত্তর:


93

দ্রষ্টব্য : এই উত্তরটি উপরে জিজ্ঞাসিত নির্দিষ্ট প্রশ্নের জন্য। আপনি যদি গুগল থেকে এখানে থাকেন এবং পাইথনে কার্টেসিয়ান পণ্য পাওয়ার কোনও উপায় খুঁজছেন itertools.productবা সাধারণ তালিকা বোঝার জন্য আপনি যা খুঁজছেন তা হতে পারে - অন্য উত্তরগুলি দেখুন।


অনুমান করা len(list1) >= len(list2) । তাহলে কি চান বলে মনে হচ্ছে দৈর্ঘ্যের সমস্ত একাধিক বিন্যাসন নিতে হয় len(list2)থেকে list1এবং তাদের list2 থেকে আইটেমগুলি সঙ্গে মেলে না। অজগরে:

import itertools
list1=['a','b','c']
list2=[1,2]

[list(zip(x,list2)) for x in itertools.permutations(list1,len(list2))]

রিটার্নস

[[('a', 1), ('b', 2)], [('a', 1), ('c', 2)], [('b', 1), ('a', 2)], [('b', 1), ('c', 2)], [('c', 1), ('a', 2)], [('c', 1), ('b', 2)]]

1
ফলাফলটি আমি যা চাই ঠিক তাই, তবে কীভাবে এটি করা যায় তার পিছনে যুক্তিটি ভাগ করা সম্ভব? আমি যদি আমার কোডটি সি বা জাভাতে রূপান্তর করি তবে আমার কাছে জিপ বা ইটারটোলে অ্যাক্সেস থাকবে না (যদিও তারা জীবনকে খুব সহজ করে
তোলে

3
@ ব্যবহারকারী1735075 ডকুমেন্টেশনটি দেখুন
অলস

1
@ user1735075: আপনি কি জানেন যে অজগরটি উন্মুক্ত উত্স? সুতরাং আপনি কেবল উত্সগুলি ডাউনলোড করতে পারেন এবং দেখুন তারা কী করে। মিঃ স্টেকের কাছে এটি উল্লেখ করার জন্য +1 যে ডকুমেন্টেশনে আসলে একটি নমুনা প্রয়োগ রয়েছে যা ব্যবহার করে না zipএবং অনুরূপ।
বাকুরিউ

2
আমি আক্ষরিকভাবে এটি কাজ করতে পারি না, এমনকি আপনার উদাহরণ সহ ... আমি যা পাই তা জিপ অবজেক্টের একটি তালিকা ..: |
m1nkeh

1
@ লোগিক প্রদান করে যা গ্রহণযোগ্য সমাধান হওয়া উচিত।
বার্নহার্ড ওয়াগনার

498

সবচেয়ে সহজ উপায়টি হ'ল itertools.product:

a = ["foo", "melon"]
b = [True, False]
c = list(itertools.product(a, b))
>> [("foo", True), ("foo", False), ("melon", True), ("melon", False)]

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

17
@ অন্তরজয় আপনি খুব ঠিক বলেছেন তবে অনেক লোক এই উত্তরটিকে সঠিক বলে মনে করছেন তবে আমি কেবল ধরে নিতে পারি যে প্রশ্নের শিরোনামের প্রসঙ্গে অভাব রয়েছে।
এক্সপি

3
@ xpy শিরোনামটি সমস্ত কিছু ব্যাখ্যা করার জন্য খুব ছোট। এজন্য আপনাকে আসল প্রশ্নটি পড়তে হবে।
ইন্টারজয়

10
ওপি অনুমতি চেয়েছিল, তবে গুগল এই উত্তরটিতে সংমিশ্রণ অনুসন্ধানকারী (আমার মতো) যে কাউকে প্রেরণ করে - এটি 8 বার ভোট পেয়ে খুশি!
জোশ ফ্রাইডল্যান্ডার

159

উপরের সরলতমগুলির চেয়ে সহজ হতে পারে:

>>> a = ["foo", "bar"]
>>> b = [1, 2, 3]
>>> [(x,y) for x in a for y in b]  # for a list
[('foo', 1), ('foo', 2), ('foo', 3), ('bar', 1), ('bar', 2), ('bar', 3)]
>>> ((x,y) for x in a for y in b)  # for a generator if you worry about memory or time complexity.
<generator object <genexpr> at 0x1048de850>

কোনও আমদানি ছাড়াই


সব থেকে ভালো সমাধান! ধন্যবাদ! অন্যান্য সমাধানগুলি সরল ভুল বা কেবলমাত্র> বি ইত্যাদির মতো নির্দিষ্ট ক্ষেত্রে কাজ করে
ফিলিপ শোয়ার্জ

3
সর্বাধিক পাইথোনিক সমাধান! (এবং অপ্রয়োজনীয় আমদানি এড়ানো)
ডালকার

6
সময়ের জটিলতা হ'ল ও (এন ^ 2)
দীপক শর্মা

2
বেটস সলিউশন !! বেয়ার বেসিক্স সর্বদা সেরা উপায়
সব্যসাচি

22

আমি কেবল অনন্য সংমিশ্রণগুলির সাথে নিজেই গুণিত একটি তালিকা খুঁজছিলাম, যা এই ফাংশন হিসাবে সরবরাহ করা হয়।

import itertools
itertools.combinations(list, n_times)

এখানে পাইথন ডক্সের সংক্ষিপ্তসার itertools হিসাবে এটি আপনাকে কী খুঁজছে তা খুঁজে পেতে সহায়তা করতে পারে।

Combinatoric generators:

Iterator                                 | Results
-----------------------------------------+----------------------------------------
product(p, q, ... [repeat=1])            | cartesian product, equivalent to a 
                                         |   nested for-loop
-----------------------------------------+----------------------------------------
permutations(p[, r])                     | r-length tuples, all possible 
                                         |   orderings, no repeated elements
-----------------------------------------+----------------------------------------
combinations(p, r)                       | r-length tuples, in sorted order, no 
                                         |   repeated elements
-----------------------------------------+----------------------------------------
combinations_with_replacement(p, r)      | r-length tuples, in sorted order, 
                                         | with repeated elements
-----------------------------------------+----------------------------------------
product('ABCD', repeat=2)                | AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
permutations('ABCD', 2)                  | AB AC AD BA BC BD CA CB CD DA DB DC
combinations('ABCD', 2)                  | AB AC AD BC BD CD
combinations_with_replacement('ABCD', 2) | AA AB AC AD BB BC BD CC CD DD

11

আপনি একটি লাইন তালিকা বোঝার চেষ্টা করতে পারেন:

>>> [name+number for name in 'ab' for number in '12']
['a1', 'a2', 'b1', 'b2']
>>> [name+number for name in 'abc' for number in '12']
['a1', 'a2', 'b1', 'b2', 'c1', 'c2']

10

বিপুল সংখ্যক তালিকার জন্য সমস্ত সংমিশ্রণগুলি সন্ধান করার সর্বোত্তম উপায় হ'ল:

import itertools
from pprint import pprint

inputdata = [
    ['a', 'b', 'c'],
    ['d'],
    ['e', 'f'],
]
result = list(itertools.product(*inputdata))
pprint(result)

ফলাফলটি হবে:

[('a', 'd', 'e'),
 ('a', 'd', 'f'),
 ('b', 'd', 'e'),
 ('b', 'd', 'f'),
 ('c', 'd', 'e'),
 ('c', 'd', 'f')]

ধন্যবাদ, দুর্দান্ত উত্তর!
toinbis

10

বা সংক্ষিপ্ত তালিকার জন্য KISS উত্তর:

[(i, j) for i in list1 for j in list2]

ইটারটুলের মতো পারফরম্যান্ট নয় তবে আপনি অজগর ব্যবহার করছেন সুতরাং ইতিমধ্যে পারফরম্যান্স আপনার শীর্ষ উদ্বেগ নয় ...

আমি অন্যান্য সমস্ত উত্তর খুব পছন্দ করি!


8

আন্তঃজয় থেকে উত্তরের জন্য একটি ছোট উন্নতি, সমতল তালিকা হিসাবে ফলাফল তৈরি করার জন্য।

>>> list3 = [zip(x,list2) for x in itertools.permutations(list1,len(list2))]
>>> import itertools
>>> chain = itertools.chain(*list3)
>>> list4 = list(chain)
[('a', 1), ('b', 2), ('a', 1), ('c', 2), ('b', 1), ('a', 2), ('b', 1), ('c', 2), ('c', 1), ('a', 2), ('c', 1), ('b', 2)]

এই লিঙ্ক থেকে রেফারেন্স


4

ইটারটুলস ছাড়াই

[(list1[i], list2[j]) for i in xrange(len(list1)) for j in xrange(len(list2))]

4

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

def rec(a, b, ll, size):
    ret = []
    for i,e in enumerate(a):
        for j,f in enumerate(b):
            l = [e+f]
            new_l = rec(a[i+1:], b[:j]+b[j+1:], ll, size)
            if not new_l:
                ret.append(l)
            for k in new_l:
                l_k = l + k
                ret.append(l_k)
                if len(l_k) == size:
                    ll.append(l_k)
    return ret

a = ['a','b','c']
b = ['1','2']
ll = []
rec(a,b,ll, min(len(a),len(b)))
print(ll)

রিটার্নস

[['a1', 'b2'], ['a1', 'c2'], ['a2', 'b1'], ['a2', 'c1'], ['b1', 'c2'], ['b2', 'c1']]

2

এর আরও ভাল উত্তর কেবল নির্দিষ্ট দৈর্ঘ্যের তালিকাগুলির জন্য কাজ করে।

এখানে এমন একটি সংস্করণ যা কোনও দৈর্ঘ্যের ইনপুটটির জন্য কাজ করে। এটি সংমিশ্রণ এবং ক্রমগমনের গাণিতিক ধারণাগুলির ক্ষেত্রেও অ্যালগরিদমকে স্পষ্ট করে তোলে।

from itertools import combinations, permutations
list1 = ['1', '2']
list2 = ['A', 'B', 'C']

num_elements = min(len(list1), len(list2))
list1_combs = list(combinations(list1, num_elements))
list2_perms = list(permutations(list2, num_elements))
result = [
  tuple(zip(perm, comb))
  for comb in list1_combs
  for perm in list2_perms
]

for idx, ((l11, l12), (l21, l22)) in enumerate(result):
  print(f'{idx}: {l11}{l12} {l21}{l22}')

এই ফলাফলগুলি:

0: A1 B2
1: A1 C2
2: B1 A2
3: B1 C2
4: C1 A2
5: C1 B2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.