给定 Lista
每个都包含一个 id 名称(例如 a
),
符号 '='
和逗号分隔的值列表。我需要生成另一个列表,它是 'id= value'
子字符串的组合,这样每个 id-value 组合都存在于输入中,并且每个值仅使用一次。
Lista:
[
'a= aVal1,aVal2',
'b=bVal1,bVal2,bVal3',
'c= cVal1,cVal2',
]
预期输出:
Listb:
[
'a=aVal1& b=bVal1&c=cVal1',
'a=aVal1&b=tyVal1&c=cVal2',
'a=aVal1&b=tyVal2&c=tzVal1',
'a=aVal1&b=tyVal2&c=tzVal2',
]
我尝试使用 itertools.permutations()
来解决这个问题功能,但我无法继续进行。我应该采取什么类型的方法来解决这个问题?
最佳答案
我通常不会针对看似家庭作业的问题发布完整的工作解决方案,所以请认为自己很幸运。 :)
#!/usr/bin/env python
from itertools import product
lista = [
'a=aVal1,aVal2',
'b=bVal1,bVal2,bVal3',
'c=cVal1,cVal2',
]
newlists = []
for s in lista:
head, _, tail = s.partition('=')
newlists.append(['%s=%s' % (head, u) for u in tail.split(',')])
listb = ['&'.join(t) for t in product(*newlists)]
for row in listb:
print row
输出
a=aVal1&b=bVal1&c=cVal1
a=aVal1&b=bVal1&c=cVal2
a=aVal1&b=bVal2&c=cVal1
a=aVal1&b=bVal2&c=cVal2
a=aVal1&b=bVal3&c=cVal1
a=aVal1&b=bVal3&c=cVal2
a=aVal2&b=bVal1&c=cVal1
a=aVal2&b=bVal1&c=cVal2
a=aVal2&b=bVal2&c=cVal1
a=aVal2&b=bVal2&c=cVal2
a=aVal2&b=bVal3&c=cVal1
a=aVal2&b=bVal3&c=cVal2
我已将列表名称更改为小写 - 以大写字母开头的名称(如 Lista
和 Listb
)通常保留用作类名称Python。
如果您不明白我在此程序中所做的任何事情,请询问,我会尽力解释。
您可以在一行中完成此操作,但它不太容易阅读:
listb = ['&'.join(t)for t in product(*[['%s=%s'%(i,v)for v in j.split(',')]for i,j in[s.split('=')for s in lista]])]
:)
字符串 .partition()
method将字符串拆分为 3 部分:分隔符之前的子字符串、分隔符本身以及分隔符之后的子字符串。
因此 head, _, tail = s.partition('=')
将 id 捕获到 head
中,并将所有关联值捕获到 tail
中。< br/>
我使用 _
捕获分隔符,以表明我们并不真正需要该值(因为我们已经知道它是 =
)。
下一行的列表理解使用 .split(',')
拆分值。
关于python - 如何在Python中获得不同的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29160872/