簡體   English   中英

Python-填補列表中的空白

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM