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