假設我有字典:
dict1 = {'A': 1, 'B': 2, 'C' : 3}
dict2 = {'a': 4, 'b': 5, 'c' : 6}
此鏈接建議了幾種合并兩者的方法,但所有合并都是簡單的串聯。我想像經銷商洗牌一樣合并它們,或者像拉鏈一樣。我的意思是,一旦合并dict1and dict2,結果dict3應該變成
dict3 = {'A': 1, 'a': 4, 'B': 2, 'b': 5, 'C' : 3, 'c' : 6}
因此,合并以交替的方式從dict1和抓取元素。dict2我的字典實際上非常大,因此手動操作不是一種選擇。
uj5u.com熱心網友回復:
有一種回圈itertools方法可以以這種方式選擇資料。
您可以使用:
dict3 = dict(roundrobin(dict1.items(), dict2.items()))
輸出:
{'A': 1, 'a': 4, 'B': 2, 'b': 5, 'C': 3, 'c': 6}
食譜:
from itertools import cycle, islice
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
num_active = len(iterables)
nexts = cycle(iter(it).__next__ for it in iterables)
while num_active:
try:
for next in nexts:
yield next()
except StopIteration:
# Remove the iterator we just exhausted from the cycle.
num_active -= 1
nexts = cycle(islice(nexts, num_active))
你也可以使用more-itertools.interleave
from more_itertools import interleave
dict(interleave(dict1.items(), dict2.items()))
uj5u.com熱心網友回復:
為便于閱讀而縮進:
from itertools import chain
dict(
chain.from_iterable(
zip(dict1.items(), dict2.items())
)
)
如果不能保證您的字典大小相同,請調整此解決方案以使用itertools.zip_longest()而不是基本zip()
uj5u.com熱心網友回復:
這種方法有很多可能出錯的地方。如果您的 2 個字典的長度不同怎么辦?如果他們有重復的密鑰怎么辦?如果以后你需要 3 個字典而不是 2 個呢?
此外,您是否有此要求背后的真實用例?你真的需要用這樣的所有資料構建一個新的字典,還是只需要像這樣以特定的、替代的方式迭代(鍵、值)對?
假設您不必擔心上述問題,如果您只需要迭代,您可以簡單地執行以下操作:
def iter_zip(dict1, dict2):
for i1, i2 in zip(dict1.items(), dict2.items()):
yield i1
yield i2
dict1 = {'A': 1, 'B': 2, 'C' : 3}
dict2 = {'a': 4, 'b': 5, 'c' : 6}
# you can then do
for key, val in iter_zip(dict1, dict2):
do_something(key, val)
如果你真的需要構建一個新的 dict,它現在很簡單:
dict(iter_zip(dict1, dict2))
# {'A': 1, 'a': 4, 'B': 2, 'b': 5, 'C': 3, 'c': 6}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/473213.html
上一篇:如何洗掉字典中的重復值?[復制]
下一篇:函式回傳單個字符而不是字串
