পুনরাবৃত্তি সঙ্গে ক্রম উত্পাদন


87

আমি ইরটারলগুলি সম্পর্কে জানি, তবে মনে হয় এটি কেবল পুনরাবৃত্তি ছাড়াই ক্রম উত্পাদন করতে পারে।

উদাহরণস্বরূপ, আমি 2 পাশ্বের জন্য সমস্ত সম্ভাব্য ডাইস রোলগুলি তৈরি করতে চাই। সুতরাং আমার পুনরাবৃত্তি সহ [1, 2, 3, 4, 5, 6] এর আকার 2 এর সমস্ত ক্রিয়াকলাপ দরকার: (1, 1), (1, 2), (2, 1) ... ইত্যাদি

সম্ভব হলে আমি এটিকে স্ক্র্যাচ থেকে বাস্তবায়ন করতে চাই না

উত্তর:


150

আপনি Cartesian পণ্য খুঁজছেন ।

গণিতে, একটি কার্টেসিয়ান পণ্য (বা পণ্য সেট) দুটি সেটের সরাসরি পণ্য।

আপনার ক্ষেত্রে, এটি {1, 2, 3, 4, 5, 6}এক্স হবে {1, 2, 3, 4, 5, 6}itertoolsআপনাকে সেখানে সাহায্য করতে পারে:

import itertools
x = [1, 2, 3, 4, 5, 6]
[p for p in itertools.product(x, repeat=2)]
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), 
 (2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), 
 (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), 
 (5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]

একটি এলোমেলো পাশা রোল পেতে ( সম্পূর্ণ অদক্ষ উপায় ):

import random
random.choice([p for p in itertools.product(x, repeat=2)])
(6, 3)

8
এটি 2 ডাইস রোল পাওয়ার অত্যন্ত অযোগ্য পদ্ধতি… দুটি কল random.randintসহজ এবং আরও দক্ষ হবে efficient
এরিক ও লেবিগোট

আপনি যখন সমস্ত সম্ভাব্য জোড়া তৈরি করবেন না তখন এলোমেলো ডাইস রোলগুলি আরও দ্রুত হবে: [রেডম ড্রেডিন্ট (1,6) আই ইন এক্সরেঞ্জ (2)]
লিওরি

13
আমি আসলে এলোমেলো রোলগুলি তৈরি করার চেষ্টা করছিলাম না, কেবলমাত্র সমস্ত সম্ভাব্য রোলগুলি তালিকাভুক্ত করার জন্য।
বুয়ব্যাট


7

অজগর 2.7 এবং 3.1 এ একটি itertools.combinations_with_replacementফাংশন রয়েছে:

>>> list(itertools.combinations_with_replacement([1, 2, 3, 4, 5, 6], 2))
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 2), (2, 3), (2, 4), 
 (2, 5), (2, 6), (3, 3), (3, 4), (3, 5), (3, 6), (4, 4), (4, 5), (4, 6),
 (5, 5), (5, 6), (6, 6)]

13
এই সমাধান সমন্বয় আউট হারায় (2, 1), (3, 2), (3, 1)এবং অনুরূপ ... সাধারণভাবে এটা সব সমন্বয় যেখানে দ্বিতীয় রোল প্রথম চেয়ে কম আউট ছেড়ে।
হলি

1

এই ক্ষেত্রে, একটি তালিকা বোঝার বিশেষত প্রয়োজন হয় না।

দেওয়া হয়েছে

import itertools as it


seq = range(1, 7)
r = 2

কোড

list(it.product(seq, repeat=r))

বিশদ

স্পষ্টতই, কার্টেসিয়ান পণ্য ক্রমান্বয়ের সাবসেটগুলি তৈরি করতে পারে। তবে এটি অনুসরণ করে:

  • প্রতিস্থাপন সঙ্গে: সব একাধিক বিন্যাসন এন উত্পাদন মাধ্যমেproduct
  • প্রতিস্থাপন ছাড়াই: পরে থেকে ফিল্টার

প্রতিস্থাপনের সাথে অনুমতি, এন আর

[x for x in it.product(seq, repeat=r)]

প্রতিস্থাপন ছাড়া অনুমতি

[x for x in it.product(seq, repeat=r) if len(set(x)) == r]
# Equivalent
list(it.permutations(seq, r))  

ফলস্বরূপ, সমস্ত সমন্বয়মূলক ফাংশনগুলি এ থেকে প্রয়োগ করা যেতে পারে product:

  • combinations_with_replacement থেকে বাস্তবায়িত product
  • combinationsবাস্তবায়িত permutations, যা দিয়ে প্রয়োগ করা যেতে পারে product(উপরে দেখুন)

-1

আমি পাওয়া একটি সমাধান শুধুমাত্র ব্যবহার lambdas, mapএবং reduce

product_function = lambda n: reduce(lambda x, y: x+y, map(lambda i: list(map(lambda j: (i, j), np.arange(n))), np.arange(n)), [])

মূলত আমি একটি প্রথম ল্যাম্বদা ফাংশন ম্যাপ করছি যা একটি সারি দেওয়া, কলামগুলি পুনরাবৃত্তি করে

list(map(lambda j: (i, j), np.arange(n)))

তারপরে এটি একটি নতুন ল্যাম্বদা ফাংশনের আউটপুট হিসাবে ব্যবহৃত হবে

lambda i:list(map(lambda j: (i, j), np.arange(n)))

যা সমস্ত সম্ভাব্য সারি জুড়ে ম্যাপ করা আছে

map(lambda i: list(map(lambda j: (i, j), np.arange(n))), np.arange(m))

এবং তারপরে আমরা সমস্ত ফলাফলের তালিকাটিকে একটিতে হ্রাস করি।

আর ভালো

দুটি পৃথক সংখ্যাও ব্যবহার করতে পারে।

prod= lambda n, m: reduce(lambda x, y: x+y, map(lambda i: list(map(lambda j: (i, j), np.arange(m))), np.arange(n)), [])

-2

প্রথমত, আপনি প্রথমে তালিকার মধ্যে itertools.permutations (তালিকা) দ্বারা ফিরিয়ে দেওয়া জেনারেটরটি পরিবর্তন করতে চান। তারপরে দ্বিতীয়ত, আপনি ডুপ্লিকেটগুলি সরিয়ে রাখতে সেট () ব্যবহার করতে পারেন নীচের মতো কিছু:

def permutate(a_list):
    import itertools
    return set(list(itertools.permutations(a_list)))

4
এতে নকল অন্তর্ভুক্ত নেই।
Björn Lindqvist

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