我有一个看起来像这样的字符串列表:
['(num1, num2):1', '(num3, num4):1', '(num5, num6):1', '(num7, num8):1']
我想要实现的目的是减少此列表,并合并每两个元素,而我要这样做,直到只剩下一个大字符串元素为止。 因此,中间列表如下所示:
['((num1, num2):1,(num3, num4):1)', '((num5, num6):1,(num7, num8):1)']
复杂的事情是(如您在中间列表中所见),两个字符串需要用括号括起来。因此,对于上述起点,最终结果应如下所示:
(((num_1,num_2):1,(num_3,num_4):1),((num_5,num_6):1,(num_7,num_8):1))
当然,这对于开始列表中的8、16或更多字符串元素也应以通用方式工作。或者更确切地说,它应该适用于an=2(n+1)
。
只需非常具体地说明8个元素的结果应如何显示:
'((((num_1,num_2):1,(num_3,num_4):1),((num_5,num_6):1,(num_7,num_8):1)),(((num_9,num_10):1,(num_11,num_12):1),((num_13,num_14):1,(num_15,num_16):1)))'
我已经使用嵌套的for循环解决了这个问题,但我认为应该有一个功能更强大的捷径解决方案。
我还在stackoverflow上发现了this solution:
import itertools as it
l = [map( ",".join ,list(it.combinations(my_list, l))) for l in range(1,len(my_list)+1)]
尽管连接还不错,但我仍然需要使用paranthens。我尝试使用:
"{},{}".format
代替.join
,但这似乎很容易实现:)。
我还考虑过使用reduce,但是显然这不是正确的功能。也许一个人可以实现自己的reduce函数?
我希望一些高级pythonics可以帮助我。
答案 0 :(得分:4)
听起来像zip
群集习惯用法:zip(*[iter(x)]*n)
的工作,您想在其中将可迭代的x
分解成大小n
的块。这将丢弃不构成完整块的“剩余”元素。对于x=[1, 2, 3]
,n=2
,这将产生(1, 2)
def reducer(l):
while len(l) > 1:
l = ['({},{})'.format(x, y) for x, y in zip(*[iter(l)]*2)]
return l
reducer(['(num1, num2):1', '(num3, num4):1', '(num5, num6):1', '(num7, num8):1'])
# ['(((num1, num2):1,(num3, num4):1),((num5, num6):1,(num7, num8):1))']