【发布时间】:2018-08-01 14:27:41
【问题描述】:
我有一个字符串列表,如下所示:
['(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 或更多字符串元素也应该以通用方式工作。或者更准确地说,它应该适用于a<sub>n</sub>=2<sup>(n+1)</sup>。
只需要非常具体地说明 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函数左右?
我希望一些高级的pythonics可以帮助我。
【问题讨论】:
-
您的中间列表中有一些额外的引号......
-
另外,你能展示你的嵌套循环解决方案吗?
-
另外,如果您的列表没有两个元素的幂会怎样?
-
没有其他人认为这是一个非常奇怪的请求,一种存储数据的低效方式并且可能是一个 XY 问题?不?好的...(对于初学者来说,为什么初始列表不是有序字典?)
-
@MadPhysicist 对不起,额外的报价。我编辑了我的帖子。此外,我明天将添加嵌套的 for 循环代码(我很着急)。用例仅适用于定义数量的元素。由于我创建了一个类,如果输入的数字不正确,我会报错。