python列表两两组合_关于python:两个列表之间的组合?已经有⼀段时间了,我很难⽤我正在尝试的算法来概括我的想法。基本上,我有两个列表,想要得到这两个列表的所有组合。
我可能解释不正确,所以这⾥举个例⼦。
name = 'a', 'b'
number = 1, 2
在这种情况下,输出将是:
1. A1 B2textbackground函数
2. B1 A2
号
棘⼿的部分是,我可能在"name"变量中的项⽬⽐"number"变量中的项⽬多(数字总是等于或⼩于name变量)。
我很困惑如何进⾏所有组合(嵌套for循环?)如果名称中的项⽬⽐数字列表中的项⽬多,则在转换名称变
量中的项⽬的逻辑上会更加混乱。
我不是最好的程序员,但如果有⼈能帮助我澄清逻辑/算法来实现这⼀点,我想我可以试⼀试。所以我被困在嵌套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
。
/图书馆/ itertools.html
"我看到dm03514招领的例⼦,它的使⽤,英语是不是我的⽬标,但itertools原型写Python代码,但希望最终在另⼀语⾔,所以我不想⽤任何⼯具是需要的elseway速效。
你问的是不是真的意义。如果第⼀个列表包含A,B,C的第⼆个包含1.2,什么是你所期望的结果吗?它可以做,如果你给的例⼦有不同的结果,⼀个4字母和⼀个数字每个(A1,A2,B1,B2)的,或如果两个表有相同的⼤⼩。
⼀个interjay同意。请指定⼀个⾮平等的⼤⼩案件,否则它不可能提供⼀个通⽤的解决⽅案。
嗨⼤家的,我更新的答案显⽰输出3和2个数字的名称,我需要它有思想,为什么在downvote苏拉。
如何将输出的外观和number = 1, 2, 3name = 'a', 'b', 'c'样的吗?
是很重要的订单或是⾜以产⽣"组合"所有你想要的吗?因此A1 B2 == B2 A1?
它会看起来像⼀mr.steak @我有2名以上的例⼦,但不是4和2年的结果会有更多的项⽬,因为有3数列表。⼀阶不bakuriu真物,试图捕捉)。
未来的⼈们注意这⼀问题的DUP ing:有⼀个像样的机会,得到了⼀系列cartesian产品列表?是⼀个更好的复制⽬标(有很多的东西是我们应该使⽤product复制在这⾥,即使这个问题没有解决的是这样)。在罕见的情况下,所有可能的两个replacements列表?可能是更好的(当选择⼀个值从每个指标在两个列表,这是⼀个解决⽅案A product再次,zipprepass)。
最简单的⽅法是使⽤itertools.product:
a = ["foo","melon"]
b = [True, False]
c = list(itertools.product(a, b))
>> [("foo", True), ("foo", False), ("melon", True), ("melon", False)]
。python基础代码大全下载
OP没有要求笛卡尔积,这个答案(以及其他⼤多数答案)没有给出问题中指定的预期结果。
@Interjay你说得很对,但似乎有太多⼈认为这个答案是正确的,所以我只能假设这个问题的标题缺乏上下⽂。
@Xpy标题太短,⽆法解释⼀切。这就是为什么你需要阅读实际的问题。微服务架构层
欧普希望做出让步,但⾕歌会派任何⼈(像我⼀样)来寻这个答案——很⾼兴看到它得到了8倍的选票!
可能⽐上⾯最简单的简单:
>>> 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)]
。
没有任何导⼊
最佳解决⽅案!谢谢您!其他的解决⽅案要么是明显错误的,要么只适⽤于特定的情况,如a>b等。
最毒⽓的解决⽅案!(避免不必要的进⼝)
时间复杂度为o(n^2)
下注解决⽅案!!简单的基础是最好的⽅法
假设len(list1) >= len(list2)。那么你想要的是从list1中获取长度为len(list2)的所有排列,并将它们与清单2中的项⽬匹配。在python中:
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)]]
号
结果正是我想要的,但是否有可能分享这背后的逻辑呢?如果我将代码转换成C或Java,我将⽆法访问ZIP或ItRealToC(虽然它们使⽣活⾮常简单)。
@⽤户1735075查看⽂档
@⽤户1735075:你知道Python是开源的吗?因此,您可以简单地下载源代码,看看它们做了什么。+1向Steak先⽣指出,该⽂档实际上有⼀个不使⽤zip和类似的⽰例实现。
太棒了..他们记录他们的算法。⾮常有帮助,谢谢Interjay和Steak先⽣!
我真的不能让它起作⽤,即使有你的例⼦…我只得到⼀个压缩对象列表。:
我在寻⼀个列表,它本⾝与唯⼀的组合相乘,作为这个函数提供。
import itertools
itertoolsbinations(list, n_times)
。
这⾥是从itertools上的python⽂档中摘录的,这可能有助于您到所需的内容。
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
您可能想尝试⼀个单⾏列表理解:
>>> [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']
。
Interjay对答案的微⼩改进,使结果成为⼀个扁平的列表。
java基础案例>>> 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)]
来⾃此链接的引⽤
回答问题"给定两个列表,从每个列表中查⼀个项⽬对的所有可能排列",并使⽤基本的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)
去除iframe滚动条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']]
。
没有Itertools
[(list1[i], list2[j]) for i in xrange(len(list1)) for j in xrange(len(list2))]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论