簡體   English   中英

如何迭代集合列表並將其轉換為 Python3 中的字典

[英]How to iterate over list of sets and converting it to a dictionary in Python3

我有以下格式的輸入,我需要遍歷它以將給定的集合轉換為字典。

input = [{"Bob","87"}, {"Mike", "35"},{"Bob", "52"}, {"Jason","35"}, {"Mike", "55"}, {"Jessica", "99"}]

我的最終目標是讓每個學生的平均數以字典的形式出現。

我試着這樣做:

marks_dict ={}
for k,v in marks:
    if k not in marks_dict.keys():
        marks_dict[k] = v
    else:
        marks_dict[k].append(v)

print(marks_dict.keys())```

I am getting in output: 
'87': 'Bob', '35': 'Mike', '52': 'Bob', 'Jason': '35', 'Mike': '55', '99': 'Jessica'}
sometimes :
Traceback (most recent call last):
  File "/Users/rbhutada/Desktop/GSTest.gyp", line 7, in <module>
    marks_dict[k].append(v)
AttributeError: 'str' object has no attribute 'append'

根據定義,集合是無序的。 所以{"Bob", "87"}{"87", "Bob"}相同。

所以你不想使用集合。 改用元組(或列表),因為它們是有序的:

input = [("Bob","87"), ("Mike", "35"),("Bob", "52"), ("Jason","35"), ("Mike", "55"), ("Jessica", "99")]

此外,當您初始化密鑰時,請使用列表[v]而不是標量v

    if k not in marks_dict.keys():
        marks_dict[k] = [v]

否則你以后不能給它 append。

所以代碼變成了( input更改為marks ,因此它適合代碼):

marks = [("Bob","87"), ("Mike", "35"),("Bob", "52"), ("Jason","35"), ("Mike", "55"), ("Jessica", "99")]

marks_dict ={}
for k,v in marks:
    if k not in marks_dict.keys():
        marks_dict[k] = [v]
    else:
        marks_dict[k].append(v)

print(marks_dict.keys())
print(marks_dict)

有了這個 output:

dict_keys(['Bob', 'Mike', 'Jason', 'Jessica'])
{'Bob': ['87', '52'], 'Mike': ['35', '55'], 'Jason': ['35'], 'Jessica': ['99']}

從那里我會留給你計算平均值。

不過,我確實建議從一開始就使用整數作為標記,而不是字符串,如果它們都是整數的話。 例如,所以87而不是"87"

如果你真的碰巧在列表中有集合,你需要先把它轉換成更容易處理的數據類型。 之后,您可以使用itertools.groupby

from itertools import groupby

lst = [{"Bob", "87"}, {"Mike", "35"}, {"Bob", "52"}, {"Jason", "35"}, {"Mike", "55"}, {"Jessica", "99"}]

def convert(item):
    """ Convert it to a tuple instead. """
    x, y = item
    if x.isdigit():
        return y, x
    else:
        return x, y

lst = sorted(map(convert, lst), key=lambda item: item[0])

result = {}
for name, values in groupby(lst, key=lambda item: item[0]):
    marks = [int(x[1]) for x in values]
    result[name] = sum(marks) / len(marks)

print(result)

結果是

{'Bob': 69.5, 'Jason': 35.0, 'Jessica': 99.0, 'Mike': 45.0}

但是首先不要使用集合,也不要使用像inputdictlist這樣的變量名。

暫無
暫無

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

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