它已经有一段时间,我有麻烦缠绕我的头周围的算法,我尽量让。 基本上,我有两个列表,并希望得到两个列表的所有组合。
我可能没有解释它是正确的所以这里有一个例子。
name = 'a', 'b'
number = 1, 2
在这种情况下,输出将是:
1. A1 B2
2. B1 A2
最棘手的部分是我可能会比在“数字”变量项目的“名称”变量更多的项目(数字总是比名义变量等于或小于)。
我很困惑该怎么办所有组合(嵌套的for循环?),甚至在逻辑比较迷茫转移的名义变量的项目事件,有在名称更多的项目比他们的号码列表。
我不是最好的程序员,但认为我可以给它一个镜头,如果有人能帮助我澄清逻辑/ algoriythm实现这一目标。 所以,我刚才一直停留在嵌套的for循环。
更新:
这里有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
Answer 1:
假设len(list1) >= len(list2)
然后,你似乎想要的是采取长的所有排列len(list2)
从list1
,并从列表2项匹配。 在蟒蛇:
import itertools
list1=['a','b','c']
list2=[1,2]
[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)]]
Answer 2:
最简单的方法是使用itertools.product
:
a = ["foo", "melon"]
b = [True, False]
c = list(itertools.product(a, b))
>> [("foo", True), ("foo", False), ("melon", True), ("melon", False)]
Answer 3:
可能比上面的简单的一个简单的:
>>> a = ["foo", "bar"]
>>> b = [1, 2, 3]
>>> [(x,y) for x in a for y in b]
[('foo', 1), ('foo', 2), ('foo', 3), ('bar', 1), ('bar', 2), ('bar', 3)]
没有任何进口
Answer 4:
我一直在寻找乘以本身只带独特组合名单,这是因为该功能提供。
import itertools
itertools.combinations(list, n_times)
这里从摘录Python文档上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
Answer 5:
你可能会想尝试一个单行列表理解:
>>> [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']
Answer 6:
一个微小的改进从interjay答案,使结果作为扁平化列表。
>>> 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)]
从这个参考链接
Answer 7:
没有itertools
[(list1[i], list2[j]) for i in xrange(len(list1)) for j in xrange(len(list2))]
Answer 8:
回答这个问题:“给定的两份名单,发现对每个列表中的一个项目的所有可能的排列”,用基本的Python功能(即不itertools),因此,很容易复制其他编程语言:
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']]
文章来源: combinations between two lists?