我有一些效率很低的代码,想让它更通用/更有效。我正在尝试从一组列表中创建字符串。

这是我目前拥有的:

#contains categories
numind = [('Length',), ('Fungus',)]

#contains values that pertain to the categories
records = [('Length', 'Long'), ('Length', 'Med'), ('Fungus', 'Yes'), ('Fungus', 'No')]

#contains every combination of values between the 2 categories.
#for example, (Long, Yes) = Length=Long & Fungus = Yes.
combinations = [('Long', 'Yes'), ('Long', 'No'), ('Med', 'Yes'), ('Med', 'No')]

现在,我想创建在组合列表中包含所有组合的字符串。这是效率低下的部分。我想要它,这样我就不必硬连接“numind”列表的长度。有任何想法吗?
values = combinations
valuestring = []

if len(numind) == 0:
   pass
elif len(numind) == 1:
   for a in xrange(len(values)):
      valuestring.append(numind[0][0]+values[a][0])

elif len(numind) == 2:
   for a in xrange(len(values)):
      valuestring.append(numind[0][0]+values[a][0]+'_'+numind[1][0]+values[a][1])

#and so forth until numind is 10+

输出
['LengthLong_FungusYes', 'LengthLong_FungusNo', 'LengthMed_FungusYes', 'LengthMed_FungusNo']

最佳答案

我将itertools.productcollections.OrderedDict一起使用(后者并非严格必要,但这意味着您无需考虑即可获得正确的订单):

>>> from collections import OrderedDict
>>> from itertools import product
>>>
>>> d = OrderedDict()
>>> for k, v in records:
...     d.setdefault(k, []).append(v)
...
>>> d
OrderedDict([('Length', ['Long', 'Med']), ('Fungus', ['Yes', 'No'])])
>>> ['_'.join(k+v for k,v in zip(d, v)) for v in product(*d.values())]
['LengthLong_FungusYes', 'LengthLong_FungusNo', 'LengthMed_FungusYes', 'LengthMed_FungusNo']
itertools.product自然产生“每个组合”部分(实际上称为笛卡尔乘积,而不是组合):
>>> product(["Long", "Med"], ["Yes", "No"])
<itertools.product object at 0x96b0dec>
>>> list(product(["Long", "Med"], ["Yes", "No"]))
[('Long', 'Yes'), ('Long', 'No'), ('Med', 'Yes'), ('Med', 'No')]

这样做的好处是,有多少个类别或与任何类别相关联的值有多少无关紧要:只要在records中指定了它们,它就可以工作。

关于python - 从列表创建字符串的有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18473515/

10-14 17:36
查看更多