[英]Python - filling gaps in list
我有一個由元組組成的列表,是從數據庫查詢生成的,例如:
list = [(0,1,1), (1,2,1), (2,4,3), (4,2,1)]
每個元組中的第一個數字必須是一個連續的數字,從0到15。可能還會有一些缺失的數字,我正在尋找填補空白的最佳方法。
目前,我是通過循環來完成此操作的,但是作為Python noob,我認為它很草率,並且有更好的方法:
# first fill in gaps
cnt = 0
for a,b,c in list:
if a > cnt:
list.insert(cnt, tuple((cnt, 0, 0)))
cnt += 1
# then add any missing at end
while cnt < 16:
list.append(tuple((cnt, 0, 0)))
cnt += 1
因此,列表開始時的預期輸出為:
list = [(0,1,1), (1,2,1), (2,4,3), (3,0,0), (4,2,1), (5,0,0), (6,0,0), (7,0,0), (8,0,0), (9,0,0), (10,0,0), (11,0,0), (12,0,0), (13,0,0), (14,0,0), (15,0,0)]
有很多方法,您可以像這樣生成一個新列表:
data = [(0,1,1), (1,2,1), (2,4,3), (4,2,1)]
out = []
for i in range(16):
if data and i == data[0][0]:
out.append(data.pop(0))
else:
out.append((i, 0, 0))
print(out)
# [(0, 1, 1), (1, 2, 1), (2, 4, 3), (3, 0, 0), (4, 2, 1),
# (5, 0, 0), (6, 0, 0), (7, 0, 0), (8, 0, 0), (9, 0, 0),
# (10, 0, 0), (11, 0, 0), (12, 0, 0), (13, 0, 0), (14, 0, 0), (15, 0, 0)]
附帶說明一下,我重命名了列表data
,因為最好避免將內置函數的名稱用作變量。
您可以將元組列表轉換為首先由元組的第一項索引的字典,以便您可以迭代0到15的范圍以找到缺失的索引,並在列表理解中為其生成默認值:
l = [(0,1,1), (1,2,1), (2,4,3), (4,2,1)]
d = {k: v for k, *v in l}
print([(i, *d.get(i, (0, 0))) for i in range(16)])
輸出:
[(0, 1, 1), (1, 2, 1), (2, 4, 3), (3, 0, 0), (4, 2, 1), (5, 0, 0), (6, 0, 0), (7, 0, 0), (8, 0, 0), (9, 0, 0), (10, 0, 0), (11, 0, 0), (12, 0, 0), (13, 0, 0), (14, 0, 0), (15, 0, 0)]
為了介紹一些有趣的語言功能(可用於解決此問題),這里提供了一種基於Python穩定排序的解決方案,該解決方案具有簡單的排序鍵函數和itertools.groupby()
,可根據索引對項目進行分組。
然后,如果輸入數據中有此索引,則取兩個中的第一個。 如果沒有此索引,則為默認項。
import itertools
received_items = [(0,1,1), (1,2,1), (2,4,3), (4,2,1)]
print(received_items)
default_items = [(i, 0, 0) for i in range(16)]
# append default items at the end
data = received_items + default_items
# perform stable sort on the index (first element) selected via key function
keyfunc = lambda x: x[0]
data.sort(key=keyfunc)
# always take first item for each index group
out = [next(v) for k,v in itertools.groupby(data, key=keyfunc)]
print(out)
輸出為:
[(0, 1, 1), (1, 2, 1), (2, 4, 3), (4, 2, 1)]
[(0, 1, 1), (1, 2, 1), (2, 4, 3), (3, 0, 0), (4, 2, 1), (5, 0, 0), (6, 0, 0), (7, 0, 0), (8, 0, 0), (9, 0, 0), (10, 0, 0), (11, 0, 0), (12, 0, 0), (13, 0, 0), (14, 0, 0), (15, 0, 0)]
以供參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.