2013-04-09 2 views
1

im пытается реализовать словарь, где в ключе есть число < = 10^9, а value - список чисел.индекс вне диапазона в словаре python

a=[] 
for i in xrange(n): 
    h,j = raw_input().split() 
    b=int(h) 
    l=int(j) 

    a[b].append(l) 

Это дает мне индекс индекса вне диапазона.

+1

'a' является пустым списком, любой индекс будет вне допустимого диапазона – askewchan

+0

где диктофон? –

ответ

3

Вы можете использовать collections.defaultdict здесь:

In [15]: from collections import defaultdict 

In [16]: dic=defaultdict(list) 

In [17]: for _ in xrange(4): 
    ....:  h,j=map(int,raw_input().split()) 
    ....:  dic[h].append(j) 
    ....:  
1 10 
1 20 
2 30 
3 5 

In [18]: dic 
Out[18]: defaultdict(<type 'list'>, {1: [10, 20], 2: [30], 3: [5]}) 

или использовать простой Dict и использовать dict.setdefault:

In [19]: dic={} #use {} for declaring a new dict 

In [20]: for _ in xrange(4): 
    ....:  h,j=map(int,raw_input().split()) 
    ....:  dic.setdefault(h,[]).append(j) 
    ....:  
1 10 
1 20 
2 30 
3 5 

In [21]: dic 
Out[21]: {1: [10, 20], 2: [30], 3: [5]} 

Сортировка словаря:

Словари не может быть отсортирован, но мы можем получить список отсортированных key,value пар или просто keys или просто values с использованием sorted:

In [25]: dic={1: [10, 30], 2: [30], 3: [5,50]} 

In [26]: sorted(dic.items(),key=lambda x:sum(x[1])) #sort based on sum of lists 
Out[26]: [(2, [30]), (1, [10, 30]), (3, [5, 50])] 

Теперь вы можете создать orderedDict из этого предыдущего списка с помощью collections.OrderedDict, так как он сохраняет порядок, в котором были вставлены ключи:

In [27]: from collections import OrderedDict 

In [30]: od=OrderedDict(sorted(dic.items(),key=lambda x:sum(x[1]))) 

In [31]: od 
Out[31]: OrderedDict([(2, [30]), (1, [10, 30]), (3, [5, 50])]) 
+0

Как мне пройти через этот словарь? Например, если я хотел сортировать его на основе суммы элементов в списке. –

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