如何在Python中获取不同的组合方式?

2024-06-28 19:28:42 发布

您现在位置:Python中文网/ 问答频道 /正文

给定Lista每个包含一个id名称(例如a),则 符号'='和逗号分隔的值列表。我需要生成另一个列表,它是'id= value'子字符串的组合,这样每个id值组合都存在于输入中,并且每个值只使用一次。你知道吗

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',
    ]

我试图用^{}函数来解决这个问题,但是我无法继续。我应该采取什么样的方法来解决这个问题?你知道吗


Tags: 字符串名称id列表value符号逗号lista
3条回答
>>> l=[i.split('=') for i in a]
>>> g=[[i]+j.split(',') for i,j in l]
>>> ['&'.join(('='.join(m),'='.join(k),'='.join(t))) for m,k,t in (product(*[list(combinations(i,2)) for i in g],repeat=1))]
['a= aVal1&b=bVal1&c= cVal1', 'a= aVal1&b=bVal1&c=cVal2', 'a= aVal1&b=bVal1& cVal1=cVal2', 'a= aVal1&b=bVal2&c= cVal1', 'a= aVal1&b=bVal2&c=cVal2', 'a= aVal1&b=bVal2& cVal1=cVal2', 'a= aVal1&b=bVal3&c= cVal1', 'a= aVal1&b=bVal3&c=cVal2', 'a= aVal1&b=bVal3& cVal1=cVal2', 'a= aVal1&bVal1=bVal2&c= cVal1', 'a= aVal1&bVal1=bVal2&c=cVal2', 'a= aVal1&bVal1=bVal2& cVal1=cVal2', 'a= aVal1&bVal1=bVal3&c= cVal1', 'a= aVal1&bVal1=bVal3&c=cVal2', 'a= aVal1&bVal1=bVal3& cVal1=cVal2', 'a= aVal1&bVal2=bVal3&c= cVal1', 'a= aVal1&bVal2=bVal3&c=cVal2', 'a= aVal1&bVal2=bVal3& cVal1=cVal2', 'a=aVal2&b=bVal1&c= cVal1', 'a=aVal2&b=bVal1&c=cVal2', 'a=aVal2&b=bVal1& cVal1=cVal2', 'a=aVal2&b=bVal2&c= cVal1', 'a=aVal2&b=bVal2&c=cVal2', 'a=aVal2&b=bVal2& cVal1=cVal2', 'a=aVal2&b=bVal3&c= cVal1', 'a=aVal2&b=bVal3&c=cVal2', 'a=aVal2&b=bVal3& cVal1=cVal2', 'a=aVal2&bVal1=bVal2&c= cVal1', 'a=aVal2&bVal1=bVal2&c=cVal2', 'a=aVal2&bVal1=bVal2& cVal1=cVal2', 'a=aVal2&bVal1=bVal3&c= cVal1', 'a=aVal2&bVal1=bVal3&c=cVal2', 'a=aVal2&bVal1=bVal3& cVal1=cVal2', 'a=aVal2&bVal2=bVal3&c= cVal1', 'a=aVal2&bVal2=bVal3&c=cVal2', 'a=aVal2&bVal2=bVal3& cVal1=cVal2', ' aVal1=aVal2&b=bVal1&c= cVal1', ' aVal1=aVal2&b=bVal1&c=cVal2', ' aVal1=aVal2&b=bVal1& cVal1=cVal2', ' aVal1=aVal2&b=bVal2&c= cVal1', ' aVal1=aVal2&b=bVal2&c=cVal2', ' aVal1=aVal2&b=bVal2& cVal1=cVal2', ' aVal1=aVal2&b=bVal3&c= cVal1', ' aVal1=aVal2&b=bVal3&c=cVal2', ' aVal1=aVal2&b=bVal3& cVal1=cVal2', ' aVal1=aVal2&bVal1=bVal2&c= cVal1', ' aVal1=aVal2&bVal1=bVal2&c=cVal2', ' aVal1=aVal2&bVal1=bVal2& cVal1=cVal2', ' aVal1=aVal2&bVal1=bVal3&c= cVal1', ' aVal1=aVal2&bVal1=bVal3&c=cVal2', ' aVal1=aVal2&bVal1=bVal3& cVal1=cVal2', ' aVal1=aVal2&bVal2=bVal3&c= cVal1', ' aVal1=aVal2&bVal2=bVal3&c=cVal2', ' aVal1=aVal2&bVal2=bVal3& cVal1=cVal2']

说明:

首先需要用=拆分字符串列表,然后创建g,如下所示:

>>> g
[['a', ' aVal1', 'aVal2'], ['b', 'bVal1', 'bVal2', 'bVal3'], ['c', ' cVal1', 'cVal2']]

现在需要创建list g元素与len2的组合,然后需要该结果的production请注意,我们需要从以下结果的每个列表中选取一个元组:

>>> [list(combinations(i,2)) for i in g]
[[('a', ' aVal1'), ('a', 'aVal2'), (' aVal1', 'aVal2')], [('b', 'bVal1'), ('b', 'bVal2'), ('b', 'bVal3'), ('bVal1', 'bVal2'), ('bVal1', 'bVal3'), ('bVal2', 'bVal3')], [('c', ' cVal1'), ('c', 'cVal2'), (' cVal1', 'cVal2')]]

你应该看看itertools.product,那可能就是你要找的。你知道吗

您可以轻松地将listA转换为3个列表:

a = ['aVal1', 'aVal2']
b = ['bVal1', 'bVal2', 'bVal3']
c = ['cVal1', 'cVal2']

那你可以试试

for x in itertools.product(a, b, c):
   print x

x将是你想要的,所有剩下的工作是字符串连接,或字符串格式化。你知道吗

更新

更多细节,你可以用这个

all_the_list = []
listB = []
for i in listA:
    name, values = i.split('=');
    k = values.strip().split(',');
    all_the_list.append(k)

// then product the out put
for aV, bV, cV in itertools.product(*all_the_list):
    listB.append('a=%s&b=%s&c=%s'%(aV, bV, cV))

希望这有帮助

我通常不会把完整的工作解决方案张贴到看起来像作业问题,所以你要考虑自己幸运。:)

#!/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

我已经将列表的名称改为小写-以大写字母开头的名称,如ListaListb,通常保留用作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]])]

:)


字符串^{} method将字符串分成3部分:分隔符前面的子字符串、分隔符本身和分隔符后面的子字符串。
因此head, _, tail = s.partition('=')将id捕获到head,并将所有相关值捕获到tail
我使用_来捕获分隔符,以指示我们实际上并不需要该值(因为我们已经知道它是=)。
下一行的列表使用.split(',')将值拆分。你知道吗

相关问题 更多 >