python列表两两组合_关于python:两个列表之间的组合?

已经有一段时间了,我很难用我正在尝试的算法来概括我的想法。基本上,我有两个列表,想要得到这两个列表的所有组合。

我可能解释不正确,所以这里举个例子。

name = 'a', 'b'

number = 1, 2

在这种情况下,输出将是:

1.  A1 B2

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

docs.python.org /图书馆/ 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)]

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

itertools.combinations(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对答案的微小改进,使结果成为一个扁平的列表。

>>> 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)

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))]

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用Python的内置函数zip()进行列表两两组合。以下是一个示例代码: ``` list1 = [1, 2, 3] list2 = ['a', 'b', 'c'] for a, b in zip(list1, list2): print(a, b) ``` 这将输出以下结果: ``` 1 a 2 b 3 c ``` zip()函数将两个列表作为输入,并返回一个元组列表,其中每个元组包含两个列表的相应元素。然后,您可以使用for循环遍历这个元组列表,并对每个元组中的元素进行操作。 ### 回答2: Python中可以使用嵌套循环来实现列表两两组合。具体步骤如下: 1. 定义一个列表,包含需要进行组合的元素。 2. 使用两个嵌套的for循环,遍历列表中的每一个元素。 3. 将两个循环变量指向的元素进行组合,并将组合结果存储到一个新的列表中。 4. 循环结束后,输出新的列表,即为所有的两两组合结果。 下面是一个例子,假设我们要对列表[1, 2, 3, 4]进行两两组合: ``` python lst = [1, 2, 3, 4] combinations = [] # 使用两个嵌套循环进行组合 for i in range(len(lst)): for j in range(i + 1, len(lst)): combination = (lst[i], lst[j]) # 将两个元素组合为一个元组 combinations.append(combination) # 将组合结果添加到新的列表中 print(combinations) ``` 运行结果为: ``` [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)] ``` 以上就是使用Python进行列表两两组合的方法。 ### 回答3: 在Python中,我们可以使用嵌套循环和列表推导式来实现列表两两组合。 首先,我们可以使用嵌套循环来遍历列表中的每个元素。在每个循环中,我们将当前元素与其后面的所有元素进行组合。如下所示: ```python my_list = [1, 2, 3, 4, 5] combinations = [] for i in range(len(my_list)): for j in range(i + 1, len(my_list)): combinations.append((my_list[i], my_list[j])) print(combinations) ``` 输出结果为: ``` [(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)] ``` 另外,我们还可以使用列表推导式来更简洁地实现列表两两组合。如下所示: ```python my_list = [1, 2, 3, 4, 5] combinations = [(my_list[i], my_list[j]) for i in range(len(my_list)) for j in range(i + 1, len(my_list))] print(combinations) ``` 输出结果与上述方式相同: ``` [(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)] ``` 以上就是利用嵌套循环和列表推导式来实现Python列表两两组合的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值