簡體   English   中英

將列表與列表列表進行比較

[英]Comparing list with a list of lists

我有一個列表string_array = ['1', '2', '3', '4', '5', '6']和一個列表multi_list = [['1', '2'], ['2', '3'], ['2', '4'], ['4', '5'], ['5', '6']]

multi_list中每個子列表的第一個元素將在string_array有一個關聯條目。

(子列表不會有重復的元素)

如何將這些關聯元素映射到字典中,例如:

{
'1': ['2'],
'2': ['3', '4'],
'3': [],
'4': ['5'],
'5': ['6'],
'6': []
}

這里有一些概念可以幫助您,但我不會為您提供完整的解決方案。 您應該自己這樣做以深入了解概念。

制作一個空的列表字典

{
    '1': [],
    '2': [],
    '3': [],
    '4': [],
    '5': [],
    '6': [],
}

您可以使用 for 循環:

list_one = ['1', '2', '3', '4', '5', '6']

my_dict = {}
for value in list_one:
    my_dict[value] = []

你也可以花哨並使用字典理解:

my_dict = {value: [] for value in list_one}

現在您需要遍歷第二個列表append加到當前列表。 例如,要附加到列表中,您可以通過以下幾種方式執行此操作:

a = [1,2]
b = [3,4]
c = 5

# add a list to a list
a += b
# now a = [1,2,3,4]

# add a list to a list
b.append(c)
# now b = [3,4,5]

要切碎列表,您可以使用切片表示法:

a = [1,2,3,4]
b = a[:2]
c = a[2:]
# now b = [1,2], and c = [3,4]

要訪問字典中的項目,您可以這樣做:

a = { '1': [1,2,3] }
a['1'] += [4,5,6]
# now a = { '1': [1,2,3,4,5,6] }
flat = ['1', '2', '3', '4', '5', '6']
nested = [['1', '2'], ['2', '3'], ['2', '4'], ['4', '5'], ['5', '6']]

result = {key: [] for key in flat}

for key in result:
    result[key] = [nest[1] for nest in nested if key == nest[0]]


#{'1': ['2'], '2': ['3', '4'], '3': [], '4': ['5'], '5': ['6'], '6': []}

使用平面列表元素作為鍵,您可以生成字典並使用空列表作為值。 如果稍后使用列表理解來生成值,空字符串或None也可以使用。

然后只需遍歷字典和嵌套列表中的鍵,將結果附加到適當的鍵。

此外;

您可以將上面的內容減少到輸出相同結果的一行。

result = {key: [nest[1] for nest in nested if key == nest[0]] for key in flat}

輸出:

{'1': ['2'], '2': ['3', '4'], '3': [], '4': ['5'], '5': ['6'], '6': []}

編輯:

在評估了 Juanpa 的評論並測試了上述代碼的效率后,很明顯在遇到大數據集時有更好的方法來運行它。

評論供參考:

這個解決方案是 O(N*M),其中 N 和 M 是平面和嵌套的大小。 你可以在 O(MAX(N, M)) 中做到這一點。 基本上,循環嵌套而不是結果,並在嵌套中執行 a,b:result[a].append(b)

運行上面的代碼,1000 次,平面列表中有 1000 個元素,嵌套中有 1000 個嵌套列表。運行時間是;

print(t.timeit(1000))
39.37227249999978

然而,使用下面的代碼運行它擁有更高效的運行時間。

print(j.timeit(1000))
0.17638869999973394

代碼:

result = {key: [] for key in flat}
for a, b in nested:
    if a in result:
        result[a].append(b)

暫無
暫無

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

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