【发布时间】:2013-12-11 10:04:23
【问题描述】:
我有嵌套列表,
a = [(2,0),(3,0),(4,2),(10,3),(11,5)]
我要做的是在n 位置添加内部元组(0,n),其中n 是a 中缺失元素的位置。每个内部列表中的第二个元素应以 1 为增量增加,如果存在间隙,则应在该间隙处插入 (0,n)。
所以列表a 的预期结果是:
a_out = [(2,0),(3,0),(0,1),(4,2),(10,3),(0,4),(11,5)]
即因为a 中的第一个和第二个元素是(3,0) 和(4,2),所以在它们之间插入了(0,1)。
我的解决方案有效,但我想知道是否有更 Pythonic 的方式来解决它?我一直在查找 Python 的 itertools 库,但找不到简洁的解决方案。
到目前为止我的代码是:
l1 = [n[1] for n in a]
l2 = range(max(l1)+1)
l3 = [n for n in l2 if not in l1]
zeros = [0]*len(l3)
inserts = zip(zeros,l3)
a_full = a + inserts
a_out = sorted(a_full, key = itemgetter(1))
谁能提出更好的解决方案?
编辑:
通常可能有许多元素具有相同的第二个内部元素(例如,a 中出现的(2,0) 和(3,0))。但是,我可以将它们组合在一起而不失一般性。
嵌套列表a 可以表示为,
a_sum = [(5,0),(4,2),(10,3),(11,5)]
通过使用代码,
a_group = [sum([x for x, y in group]) for key, group in groupby(a, key=itemgetter(1))]
a_sum = zip(output,list(set(l1)))
编辑二:
a 的长度始终为 600,但根据研究的进展情况,这可能会增加到 10**3 的顺序。
【问题讨论】:
-
您确定要将
(2, 0)放在列表的开头吗?无法通过插入项目来修复(2, 0)和(3, 0)一起出现的问题。 -
我刚刚添加了一个编辑来解决您的评论。我可以通过将具有相同第二个内部元素的元素分组然后将它们相加来解决这个问题;单独的元素
(2,0)和(3,0)可以组合成(5,0)wlog。
标签: python insert nested tuples