我有嵌套列表,插入基於條件的嵌套列表缺少的元素 - Python的
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))
任何人都可以提出一個更好的解決這個?
編輯:
一般可以有許多的元素用相同的第二內部元件(例如(2,0)
和(3,0)
發生的歷史中a
)。但是,我可以將它們組合在一起而不會失去一般性。
嵌套列表然後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)))
EDIT II:
的a
長度總是600,但是根據研究如何進行,可能會增加到10 ** 3。
你確定你想在列表的開始處使用'(2,0)'?無法通過插入項目來修復出現在一起的「(2,0)」和「(3,0)」。 – user2357112
我剛剛添加了一條修改以解決您的評論。我可以通過對具有相同第二個內部元素的元素進行分組來解決此問題,然後將這些元素相加;單獨的元素'(2,0)'和'(3,0)'可以組合成'(5,0)'wlog。 – Holtz