Python,来自其他列表的元素对的列表

标签 python arrays python-3.x list

我有一系列列表,称它们为 ABCDE。现在每个列表都有 5 个具有相同名称的元素,例如:

A: [ 'Cars_A', 'Planes_A', 'Houses_A', 'Bikes_A' ] 
B: [ 'Cars_B', 'Planes_B', 'Houses_B', 'Bikes_B' ]
etc..

我想要的是一个列表列表,其形式为:

[ ['Cars_A', 'Planes_B'], ['Cars_A', 'Houses_B'], ['Cars_A', 'Bikes_B'], 
  ['Planes_A', 'Cars_B'], ['Planes_A', 'Houses_B'], ['Planes_A', 'Bikes_B'],
  ['Houses_A', 'Cars_B'], ['Houses_A', 'Planes_B'], ['Houses_A', 'Bikes_B'],
  ['Bikes_A', 'Cars_B'], ['Bikes_A', 'Planes_B'], ['Bikes_A', 'Houses_B'] ] 

可以看出,这个列表的规则是:

  • 一个元素不能与同一集合中的另一个元素组合在一起,例如不允许使用 ['Cars_A', 'Planes_A']
  • 元素不能与不同集合中的相似元素组合在一起,例如不允许使用 ['Cars_A', 'Cars_B']

我现在的尝试是对所有 5 个列表进行嵌套 for 循环,但如果可能的话我想避免这种情况。有任何想法吗?

最佳答案

itertools.permutationsitertools.product过滤器一起使用:

import itertools

l = [['_'.join([i,g])for i in ['cars', 'planes', 'houses', 'bikes']] for g in 'ABCDE']
l    
[['cars_A', 'planes_A', 'houses_A', 'bikes_A'],
 ['cars_B', 'planes_B', 'houses_B', 'bikes_B'],
 ['cars_C', 'planes_C', 'houses_C', 'bikes_C'],
 ['cars_D', 'planes_D', 'houses_D', 'bikes_D'],
 ['cars_E', 'planes_E', 'houses_E', 'bikes_E']]

res = []
for sub in itertools.permutations(l, 2):
    res.extend(list(filter(lambda x: (x[0].split('_')[0]!=x[1].split('_')[0]), itertools.product(*sub))))    
res
[('cars_A', 'planes_B'),
 ('cars_A', 'houses_B'),
 ('cars_A', 'bikes_B'),
 ('planes_A', 'cars_B'),
 ('planes_A', 'houses_B'),
 ('planes_A', 'bikes_B'),
 ('houses_A', 'cars_B'),
 ...
 ('bikes_E', 'cars_D'),
 ('bikes_E', 'planes_D'),
 ('bikes_E', 'houses_D')]

关于Python,来自其他列表的元素对的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55298964/

相关文章:

python - Python 中的简单语法错误 if else 字典理解

Python使用存储在变量中的将stdout和stderr发送到多个文件

python - 为什么匹配组存在但并不真正匹配?

c - 关于优化这个 C 程序的建议?

python - 无法使用请求从网页中抓取一些静态图像链接

python - 如何检测 RSS 提要中的更改项和新项?

使用 C 创建列表和结构数组

java - 如何跳出嵌套循环

python - django-paypal 突然停止接收来自 Paypal 的信号

python - 如何将列表应用于 Pandas 组