簡體   English   中英

Python-合並兩個2D列表,覆蓋其中一個的值

[英]Python - merging two 2D lists, overwriting values of one

我有二維清單

list 1 = [[None, None], [None, None], [None, None]]
list 2 = [[1, 2], [3, 4]]

所需的輸出是

list 3 = [[1, 2], [3, 4], [None, None]]

如果有一個更簡單的解決方案,我這樣做是因為我並不總是擁有列表中第三個元素的數據。 我需要該列表始終包含三個第一級項目。 我試圖阻止我的腳本拋出out of range錯誤。

希望能解決以下問題的一些其他背景。

當數據庫查詢返回放入列表中的結果(例如“最大的10個問題”)時,這在我的應用程序中出現。 有時候情況還不錯,只有9個問題。

當應用程序的另一部分尋找該第十個問題時(一個Flask網站),它將引發錯誤。 嘗試/除外確實可以工作,但是會很沉重。

因此,我需要一個解決方案,在該解決方案中,我可以創建一個占位符值列表,並在可用時用數據覆蓋它們。

接受的解決方案僅需一行代碼就可以很好地工作。

我想這就是你的意思

list_3 = [ list_2[i] if i < len(list_2) else e for i,e in enumerate(list_1) ]

這是沒有列表理解的等效項

list_3 = list()
for i,e in enumerate(list_1):
    if i < len(list_2):
        list_3.append(list_2[i])
    else:
        list_3.append(e)

我不確定我是否完全理解您的問題,但是我認為您可能想要這樣:

list1 = [[None, None], [None, None], [None, None]]
list2 = [[1, 2], [3, 4]]
list3 = list2 + list1[len(list2):]

在第三行中,list2中的所有元素將替換list1中的len(list2)元素,但其余元素保持不變。 如果這是您想要的,則應確保list1的長度不少於list2,否則,它將引發IndexError

您無需創建新列表。 只需使用以下內容訪問list2的元素

list2[10] if 10 < len(list2) else [None, None]

我已將索引設為10以下,但在您的情況下,它很可能是變量:

list2[i] if i < len(list2) else [None, None]

如果要對兩個列表進行操作,請考慮使用itertools.izip_longest來將它們組合在一起。

In [1]: list1 = [[None, None], [None, None], [None, None]]

In [2]: list2 = [[1, 2], [3, 4]]

In [3]: import itertools

In [8]: [a for a, b in itertools.izip_longest(list2, list1, fillvalue=[None, None])]
Out[8]: [[1, 2], [3, 4], [None, None]]

請注意,在Python 3中,名稱為itertools.zip_longest

您可以這樣進行:

list_3 = list_2 + list_1[len(list_2):]

但是我不確定需要做什么。

您可以使用生成器,該生成器首先從list_2生成元素,然后生成None值。 然后,只需從該生成器獲取前3個元素。

from itertools import chain, islice, repeat
list_2 = [[1, 2], [3, 4]]
list_3 = list(
    islice(
        chain(
            list_2,
            repeat(None)
        ),
        3))

但是您可能正面臨一個典型的數據丟失問題。 如果您要處理大量數據,建議您使用Pandas。 這是Pandas文檔中的相關文本: http : //pandas.pydata.org/pandas-docs/stable/missing_data.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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