2015-11-17 87 views
1

我有問題與製作字典,並從我的名單和值列表中獲取鍵和值。從列表獲取鍵和值

名單如下:

['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) 

我不如何​​繼續

謝謝您的建議。

+2

你有什麼試過的?什麼具體不工作?你得到什麼錯誤?你的代碼是什麼樣的? – DilithiumMatrix

+0

首先不要建立列表。直接從文件構建字典要容易得多。當你建立這個列表時,你會失去文件給你的自然分組。 – user2357112

+0

@ user2357112,這對於重複鍵不起作用 –

回答

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

只需遍歷列表,逐步加2,並抓住每個鍵/值。像這樣

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

替換爲任何適合您的問題

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() 
+0

先閱讀問題。 –

+0

謝謝@AhsanulHaque – fivetentaylor

-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 
+0

不幸的是,但它是獎金作業的任務,所以我試圖做,但現在我趕時間 –

+0

@Padraic坎寧安你100%正確。你的回答是真正的python礦是'python for dummies'(沒有冒犯)。 – poko

+0

我不想冒犯,但這不應該是贏家。在 – fivetentaylor

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 
0

加載到一個字典是容易的,但你需要像一個繪圖庫Matplotlib來生成餅圖。

#load the value in the list 
k = ['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'] 

#create a dictionary to hold the values 
d = {} 

for i in range(0,len(k),2):#iterate the length of the list, i will be every other index 
    key = k[i] 
    val = float(k[i+1]) 
    if d.has_key(key): #if the key exists perform summation 
     d[key] += val 
    else: #if the key does not exist create it 
     d[key] = val 

# a plotting library like matplot lib is required for the pie chart 
import matplotlib.pyplot as plt 
labels = d.keys() 
values = d.values() 

plt.pie(values,    # data 
     labels=labels,  # slice labels 
     autopct='%1.1f%%', # print the values inside the wedges 
     ) 

plt.show()