我的情況如下。像這樣的嵌套回圈:
d = [{'val1': 1, 'val2':2}, {'val3': 3, 'val4':4}, {'val5': 5, 'val6':6}, {'val7': 7, 'val8':8}, {'val9': 9, 'val10':10}]
num = list(range(len(d))
new_list = []
for i in num:
for k, v in d[i].items():
new_list.append([k ,v])
結果將是這樣的:
[['val1', 1],
['val2', 2],
['val3', 3],
['val4', 4],
['val5', 5],
['val6', 6],
['val7', 7],
['val8', 8],
['val9', 9],
['val10', 10]]
Bu 需要找到一種方法來總結這些回圈,或者使用 Map 和 Filter 之類的函式,或者使用我讀過的 Itertools.product 將嵌套回圈變成僅回圈。所以我做了這個代碼:
new_list = []
for i, (k,v) in itertools.product(num, d[i].items()):
new_list.append([k ,v])
結果是這樣的:
[['val9', 9],
['val10', 10],
['val9', 9],
['val10', 10],
['val9', 9],
['val10', 10],
['val9', 9],
['val10', 10],
['val9', 9],
['val10', 10]]
所以我想知道是否有任何方法itertools.product可以產生與嵌套回圈的代碼相同的結果,也就是說,輸出是按順序排列的,而不僅僅是重復最后兩個值。如果有mapor的解決方案filter,也歡迎。
更新
@BrokenBenchmark 我的問題有點復雜,你能幫幫我嗎?問題是這樣的:
d = [{'val1': 1, 'val2':2}, {'val3': 3, 'val4':4}, {'val5': 5, 'val6':6}, {'val7': 7, 'val8':8}, {'val9': 9, 'val10':10}]
d2 = [{'val1': 1, 'val2':2}, {'val3': 3, 'val4':4}, {'val5': 5, 'val6':6}, {'val7': 7, 'val8':8}, {'val9': 9, 'val10':10}]
num = list(range(len(d))
new_list = []
for i in num:
for k_i, v_i in d[i].items():
for j in num:
for k_j, v_j in d2[j].items():
new_list.append([k_i, k_j])
你有解決方案嗎?這可以代替這個嵌套回圈來加快代碼速度。
我需要的輸出是包含 dict 1 中的鍵以及 dict 2 中的所有鍵的串列(我需要將 dict 1 中的每個鍵與 dict 2 中的每個鍵進行比較)。輸出應該是這樣的:
[['Key1_dict1', 'Key1_dict2'],
['Key1_dict1', 'Key2_dict2'],
['Key1_dict1', 'Key3_dict2'],
['Key1_dict1', 'Key4_dict2'],
['Key1_dict1', 'Key5_dict2'],
['Key1_dict1', 'Key6_dict2'],
['Key1_dict1', 'Key7_dict2'],
['Key1_dict1', 'Key8_dict2'],
['Key1_dict1', 'Key9_dict2'],
['Key1_dict1', 'Key10_dict2'],
['Key2_dict1', 'Key1_dict2'],
['Key2_dict1', 'Key2_dict2'],
['Key2_dict1', 'Key3_dict2'],
['Key2_dict1', 'Key4_dict2'],
['Key2_dict1', 'Key5_dict2'],
['Key2_dict1', 'Key6_dict2'],
['Key2_dict1', 'Key7_dict2'],
['Key2_dict1', 'Key8_dict2'],
['Key2_dict1', 'Key9_dict2'],
['Key2_dict1', 'Key10_dict2']]
等等。
uj5u.com熱心網友回復:
解決方案#1:
d = [{'val1': 1, 'val2':2}, {'val3': 3, 'val4':4}, {'val5': 5, 'val6':6}, {'val7': 7, 'val8':8}, {'val9': 9, 'val10':10}]
d2 = [{'val1': 1, 'val2':2}, {'val3': 3, 'val4':4}, {'val5': 5, 'val6':6}, {'val7': 7, 'val8':8}, {'val9': 9, 'val10':10}]
new_list = [[k_i, k_j] for i in range(len(d)) for k_i, v_i in d[i].items() for j in range(len(d2)) for k_j, v_j in d2[j].items()]
輸出:
[['val1', 'val1'], ['val1', 'val2'], ['val1', 'val3'], ['val1', 'val4'], ['val1', 'val5'], ['val1', 'val6'], ['val1', 'val7'], ['val1', 'val8'], ['val1', 'val9'], ['val1', 'val10'], ['val2', 'val1'], ['val2', 'val2'], ['val2', 'val3'], ['val2', 'val4'], ['val2', 'val5'], ['val2', 'val6'], ['val2', 'val7'], ['val2', 'val8'], ['val2', 'val9'], ['val2', 'val10'], ['val3', 'val1'], ['val3', 'val2'], ['val3', 'val3'], ['val3', 'val4'], ['val3', 'val5'], ['val3', 'val6'], ['val3', 'val7'], ['val3', 'val8'], ['val3', 'val9'], ['val3', 'val10'], ['val4', 'val1'], ['val4', 'val2'], ['val4', 'val3'], ['val4', 'val4'], ['val4', 'val5'], ['val4', 'val6'], ['val4', 'val7'], ['val4', 'val8'], ['val4', 'val9'], ['val4', 'val10'], ['val5', 'val1'], ['val5', 'val2'], ['val5', 'val3'], ['val5', 'val4'], ['val5', 'val5'], ['val5', 'val6'], ['val5', 'val7'], ['val5', 'val8'], ['val5', 'val9'], ['val5', 'val10'], ['val6', 'val1'], ['val6', 'val2'], ['val6', 'val3'], ['val6', 'val4'], ['val6', 'val5'], ['va...
解決方案#2:
k, k2 = chain(*[m.keys() for m in d]), chain(*[m.keys() for m in d2])
new_list_of_tuples = list(product(k, k2)) # if tuples are OK as key pairs
new_list = [[*x] for x in product(k, k2)] # if you need lists as key pairs
uj5u.com熱心網友回復:
如果您不想使用嵌套for回圈,可以使用.extend()將字典的鍵值對附加到串列中,并將map()每個元素轉換.items()為串列。
itertools.product()可以減少for回圈中的嵌套,例如,當您需要遍歷兩個串列中的每對元素時。它不是for洗掉所有嵌套回圈的靈丹妙藥。
data = [{'val1': 1, 'val2':2}, {'val3': 3, 'val4':4}, {'val5': 5, 'val6':6}, {'val7': 7, 'val8':8}, {'val9': 9, 'val10':10}]
result = []
for dictionary in data:
result.extend(map(list, dictionary.items()))
print(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/426850.html
上一篇:可選函式引數哪個子集串列?
