2012-02-12 4 views
1

У меня есть файл, например:словарь со списком значений

a 1 
a 2 
b 5 
c 8 
a 9 

Я хочу, чтобы сложить второе поле в ключе, так что у меня есть суммарное количество и, следовательно, один ключ: пары значений.

С большим набором данных я думаю, что лучший способ сделать это - создать словарь, содержащий список значений для каждого уникального ключа. Это лучший подход?

Как настроить списки значений для каждой клавиши точно (ниже код, кажется, перезаписывает значения вместо добавления)?

dict={} 
file=open('foo.txt','r') 
lines=file.readlines() 
for line in lines: 
     k, v=line.split() 
     dict[k]=[v] 

теперь, если я хочу взять суммарные количества заселенных в первом словаре и сравнить оба ключи и значения против ключей и значений в другом словаре, чтобы определить различия между ними, я могу только заключить, что-то вроде следующего :

для г в res.keys():

if res2.get(i): 
    print 'match',i 
else: 
    print i,'does not match' 

для г в res2.keys():

if res.get(i): 
    print 'match',i 
else: 
    print i,'does not match' 

для г в res.values ​​():

if res2.get(i): 
    print 'match',i 
else: 
    print i,'does not match' 

для г в res2.values ​​():

if res.get(i): 
    print 'match',i 
else: 
    print i,'does not match' 

громоздким и глючит ... нужна помощь!

ответ

1

Это именно то, что setdefault() для:

d = {} 
with open('foo.txt','r') as f: 
    for line in f: 
     k,v = line.split() 
     d.setdefault(k, []).append(v) 

Кроме того, не следует использовать dict в качестве имени переменной. И вы можете выполнять итерацию непосредственно над файлом; не нужно использовать .readlines() здесь.

4

Если вам просто нужно общее количество, вам не нужно создавать list для добавления элементов. Вы можете использовать defaultdict и продолжать добавлять к нему, чтобы получить общее количество.

from collections import defaultdict 
key_totals = defaultdict(int) 
with open('foo.txt', 'r') as f: 
    for line in f: 
     k, v = line.split() 
     key_totals[k] += int(v) 
7

Используйте defaultdict для расчета суммы:

from collections import defaultdict 
res = defaultdict(int) 
with open('foo.txt', 'r') as f: 
    for line in f: 
    k,v = line.split() 
    res[k] += int(v) 
# res is now {"a": 12, "b": 5, "c": 8} 

Если вы не хотите, чтобы суммы, но списки элементов, изменить что:

from collections import defaultdict 
res = defaultdict(list) 
with open('foo.txt', 'r') as f: 
    for line in f: 
    k,v = line.split() 
    res[k].append(v) 
# res is now ["a": ["1", "2", "9"], "b": ["5"], "c": ["8"]] 

Обратите внимание, что я изменены некоторые имена переменных, заметные file - f и dict - res. Это потому, что file и dict - это имена встроенных модулей, поэтому их следует избегать как имена переменных, чтобы избежать путаницы.

Также не требуется readlines; вы можете напрямую перебирать файл.

Кроме того, инструкция with гарантирует, что файл будет закрыт после этого.

+0

awesome ... thx за помощью! – NewToPy

+0

Если этот (или любой другой ответ) решает вашу проблему, рассмотрите [принятие его] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). – phihag

+0

будет res [k] .append (v) работать, если у меня есть несколько переменных, которые я хочу добавить? то есть. k, field1, field2, field3, field4 = line.split() res [k] .append (field1, field2, field3, field4) – NewToPy

Смежные вопросы