以特定方式缩小列表

时间:2018-08-01 14:27:42

标签: python reduce

我有一个看起来像这样的字符串列表:

['(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可以帮助我。

1 个答案:

答案 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))']