以特定的方式减少列表

2024-06-26 17:45:47 发布

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

我有一个字符串列表,如下所示:

['(num1, num2):1', '(num3, num4):1', '(num5, num6):1', '(num7, num8):1']

我试图实现的是减少这个列表并合并每两个元素,我想这样做,直到只剩下一个大字符串元素。 所以中间列表如下所示:

['((num1, num2):1,(num3, num4):1)', '((num5, num6):1,(num7, num8):1)']

复杂的事情是(正如您在中间列表中看到的那样),两个字符串需要用paranethesis包装。因此,对于上述起点,最终结果应如下所示:

(((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)]

虽然,加入还不错,但我还是需要论文。我试着用:

"{},{}".format

而不是.join,但这似乎很容易工作:)。你知道吗

我也想过使用reduce,但显然这不是正确的函数。或许可以实现一个自己的reduce函数?你知道吗

我希望一些先进的Python可以帮助我。你知道吗


Tags: 字符串元素列表foritnumlistnum2
2条回答

听起来像是针对zip集群习惯用法的工作:zip(*[iter(x)]*n),在这里您想要将iterable 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))']

这是对zip(*[iter(l)]*2)发生的事情的解释

[iter(l)*2]这将创建一个长度为2的列表,其中包含两倍于同一iterable元素的元素,或者更精确地说,包含对同一iter对象的两个引用。你知道吗

zip(*...)执行提取。它吸引:

  1. 回路

    • iter对象的第一个引用中的第一个元素
    • iter对象的第二个引用中的第二个元素
  2. 回路

    • iter对象第一次引用的第三个元素
    • iter对象第二个引用的第四个元素
  3. 回路

    • iter对象第一次引用的第五个元素
    • iter对象第二次引用的第六个元素

等等。。。你知道吗

因此,我们在for循环中有提取的元素,可以将它们用作xy进行进一步处理。你知道吗

这真的很方便。你知道吗

我还想指出this thread,因为它帮助我理解了这个概念。你知道吗

相关问题 更多 >