从列表获取键和值

时间:2015-11-17 18:40:58

标签: python list dictionary matplotlib

我在编写字典并从名单和值列表中获取键和值时遇到问题。

列表如下所示:

['smer', '1245', 'kdh', '7845', 'smer', '697', 'sns', '78', 'du', '421', 'smer', '632', 'ol', '4144', 'most-hid', '457', 'smer', '12', 'ol', '897', 'most-hid', '1234', 'kdh', '555', 'ol', '898', 'du', '7845']

我的问题是如何将名称作为键,将数字作为值。

如果密钥已经在字典中,它将把这些值加在一起。

然后我如何从中制作饼图。

我只是在学习python而我无法解决这个问题。

def strany():
slovnik={}
zoznam=[]
x=open('Strany.txt','r')
for i in x.readlines():
    i=i.strip()
    casty=i.split(' ')
    for x in casty:
        zoznam.append(x)

我不知道如何继续

感谢您的建议。

6 个答案:

答案 0 :(得分:4)

您可以使用collections.defaultdict对重复键的值求和,在列表中调用ite r并在压缩后解压缩每个配对:

l = ['smer', '1245', 'kdh', '7845', 'smer', '697', 'sns', '78', 'du', '421', 'smer', '632', 'ol', '4144', 'most-hid', '457', 'smer', '12', 'ol', '897', 'most-hid', '1234', 'kdh', '555', 'ol', '898', 'du', '7845']

from collections import defaultdict

d = defaultdict(int)
it = iter(l)
for k,v in zip(it,it):
    d[k] += int(v)

print(d) 
defaultdict(<class 'int'>, {'sns': 78, 'ol': 5939, 'du': 8266, 'smer': 2586, 'most-hid': 1691, 'kdh': 8400})

如果您来自文件的配对只是在您使用csv lib解析文件时解压缩,假设您的数据由whitesapce分隔:

from collections import defaultdict
import csv

with open("infile") as f:
    d = defaultdict(int)
    for k,v in csv.reader(f,delimiter=" "):
        d[k] += int(v)

print(d)

您可以使用常规字典和dict.setdefault

来实现相同目的
with open("infile") as f:
    d = {}
    for k,v in csv.reader(f,delimiter=" "):
        d.setdefault(k , 0)
        d[k] += int(v)

答案 1 :(得分:1)

只需遍历列表,踩两个,然后抓取每个键/值。像这样

l = ['1','a','2','b','3','c']
for i in range(0, len(l), 2):
    print('key=' + l[i] + 'value=' + l[i+1])

将打印功能替换为适合您问题的打印功能

答案 2 :(得分:0)

import matplotlib.pyplot as plt

summed = {}
x = ['smer', '1245', 'kdh', '7845', 'smer', '697', 'sns', '78', 'du', '421', 'smer', '632', 'ol', '4144', 'most-hid', '457', 'smer', '12', 'ol', '897', 'most-hid', '1234', 'kdh', '555', 'ol', '898', 'du', '7845']
it = iter(x)
for k,v in zip(it,it):
    summed[k] = summed.get(k,0) + float(v)

plt.pie(summed.values(), labels=summed.keys())
plt.show()

要处理文件部分,假设您需要在文件中的所有行中使用单个饼图:

import matplotlib.pyplot as plt

with open('Strany.txt') as f:
    it = (y for z in f for y in z.strip().split())

summed = {}
for k,v in zip(it,it):
    summed[k] = summed.get(k,0) + float(v)

plt.pie(summed.values(), labels=summed.keys())
plt.show()

答案 3 :(得分:0)

您可以从列表中创建一个迭代器并使用它的next方法

lt_iter= iter(lst)
dic={}
while True:
    try:
        key=lt_iter.next()
        value= lt_iter.next()
        if key in dic:
            dic[key]+=value
        else:
            dic[key]=value
    except StopIteration:
        break

print dic

答案 4 :(得分:0)

加载到字典很容易,但是您需要像default value这样的绘图库来生成饼图。

src

答案 5 :(得分:-2)

statistics.sk正在为选举做准备吗? muhehehe

result = {}
a=['smer', '8', 'kdh', '7', 'smer', '6']
while a:
    party = a.pop(0)
    number = int(a.pop(0))
    if (party in result.keys()):
        result[party]+=number
    else:
        result[party]=number