我試圖將一個字串串列拆分成一個字典,其中一些字串在拆分后最終成為重復的鍵,我的最終目標是拆分串列然后總結每個鍵的值。我有以下代碼有效,但是我收到一個 ValueError: too many values to unpack (expected 2)。當串列包含負整數時。我將如何解決這個問題。
v=["a:1", "b:3", "c:5","c:3"]
list_of_str = list(map(lambda elem: elem.replace(":", ''), v))
list_of_str
from collections import defaultdict
my_dict = defaultdict(list)
for k, v in list_of_str:
my_dict[k].append(v)
my_dict
defaultdict(list, {'a': ['1'], 'b': ['3'], 'c': ['5', '3']})
串列中為負值的結果
v=["a:1", "b:3", "c:5","c:-3"]
list_of_str = list(map(lambda elem: elem.replace(":", ''), v))
list_of_str
?
from collections import defaultdict
my_dict = defaultdict(list)
for k, v in list_of_str:
my_dict[k].append(v)
my_dict
ValueError Traceback (most recent call last)
<ipython-input-48-7a8d435becbb> in <module>
5 from collections import defaultdict
6 my_dict = defaultdict(list)
----> 7 for k, v in list_of_str:
8 my_dict[k].append(v)
9 my_dict
ValueError: too many values to unpack (expected 2)
The result I am going for:
defaultdict(list, {'a': ['1'], 'b': ['3'], 'c': ['5', '3']})
a:1,b:3,c:8
uj5u.com熱心網友回復:
在構建字典的回圈中,您正在遍歷list_of_str. 這些元素中的每一個都是一個字串,通過這樣做,for k, v in ...您要求的是該字串的前兩個字符。
碰巧在你的第一個例子中,每個字串最后只有兩個字符。然而,當你有一個負數時,你突然有了三個值,而你只要求兩個(即你實際上有'c', '-', 和'3')。
您可以在替換時使用更令人難忘的東西而不是空字串來簡化您的問題':':
list_of_str = list(map(lambda elem: elem.replace(":", ','), v))
這樣你就可以拆分回圈中碰巧是鍵值對的任何東西,
for el in list_of_str:
key, value = el.split(',')
my_dict[key].append(value)
然而,這是多余的,更好的方法是完全跳過替換并':'在回圈中直接拆分,
for el in v:
key, value = el.split(':')
my_dict[key].append(value)
uj5u.com熱心網友回復:
當您在字串串列上回圈并嘗試提取兩個值時,每個字串都被視為可互動的,每個字符都是可迭代的值。
所以當你在做:
k, v = 'b3'
# k = 'b', v = '3'
但是當你在做:
k, v = 'c-3'
# k = 'c', 'v' = '-'
在上面的例子中,字串仍然有一個字符,這就是為什么你得到
ValueError: too many values to unpack (expected 2)代碼預期的 2 個值,但你提供了 3 個。
你可以這樣做:
from collections import defaultdict
v = ['a:1', 'b:3', 'c:5', 'c:3', 'd:-4']
my_dict = defaultdict(list)
for str in v:
key, value = str.split(':')
my_dict[key].append(value)
uj5u.com熱心網友回復:
它只是@Speedlulu 實作的一個變體
對不起,我沒有足夠的聲譽發表評論(
data = ['a:1', 'b:3', 'c:5', 'c:3']
result = {}
for item in data:
k, v = item.split(':', 1)
result[k] = result.get(k, 0) int(v)
from collections import defaultdict
data = ['a:1', 'b:3', 'c:5', 'c:3']
result = defaultdict(int)
for item in data:
k, v = item.split(':')
result[k] = int(v)
結果 == {'a':1,'b':3,'c':8}
uj5u.com熱心網友回復:
單線解決方案)
from itertools import groupby
from operator import itemgetter
data = ['a:1', 'b:3', 'c:5', 'c:3']
result = {k: sum(map(int, map(itemgetter(1), g))) for k, g in groupby((v.split(':', 1) for v in sorted(data)), key=itemgetter(0))}
assert result, {'a': 1, 'b': 3, 'c': 8}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/400150.html
上一篇:如何從txt檔案制作字典?
