2014-12-04 35 views
5

Tôi có danh sách sau đây:Làm cách nào để thêm giá trị vào các khóa trong từ điển trong vòng lặp?

x=['a','3','4','b','1','2','c','4','5'] 

Làm thế nào tôi có thể làm cho từ điển sau:

b = {'a':[3,4],'b':[1,2],'c':[4,5]} 

tôi thử như sau:

Category = defaultdict(int) 
for i in a: 
    if Varius.is_number(i)==False: 
     Category[i]=[] 
     keys.append(i) 
    else: 
     Category[keys(i)] = i 

Các phím được tạo ra nhưng sau khi tôi có vấn đề để chèn các giá trị. (is_number là một hàm kiểm tra xem giá trị của danh sách là số hay chuỗi) .Ngày đầu tiên của MATLAB. Ngày đầu tiên trong Python ..

Trả lời

4

Dưới đây là một ví dụ thực sự sử dụng tính năng defaultdict cung cấp trên bình thường dict:

from collections import defaultdict 

x=['a','3','4','b','1','2','c','4','5'] 

key='<unknown>' # needed if the first value of x is a number 
category = defaultdict(list) # defaultdict with list 
for i in x: 
    if i.isalpha(): 
     key = i; 
    else: 
     category[key].append(i) # no need to initialize with an empty list 

print category 

Ngoài ra: bạn nên sử dụng tên chữ thường cho các phiên bản lớp. Tên viết hoa thường được dành riêng cho các lớp. Đọc pep8 để có hướng dẫn về phong cách.

1

Giả sử bạn có một phím trên vị trí đầu tiên trong danh sách của bạn (x) và rằng sau khi một bức thư, sẽ có một số:

from collections import defaultdict 

x=['a','3','4','b','1','2','c','4','5'] 

key = x[0] 
Category = defaultdict(int) 
for i in x: 
    if i.isalpha(): 
     key = i; 
    else: 
     Category[key].append(i) 

print Category 
+0

Nếu bạn initializ e mỗi giá trị từ điển với một danh sách trống, không cần sử dụng 'defaultdict'. – PeterE

+0

@Peter, điểm tốt. – syntagma

2

Bạn có thể sử dụng itertools.groupby:

>>> from itertools import groupby 
>>> l=[list(g) for k,g in groupby(x,lambda x : x.isalpha())] 
>>> p=[l[i:i+2] for i in range(0,len(l),2)] 
>>> {i[0]:map(int,j) for i,j in p} 
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]} 
+0

Tôi không nghĩ rằng OP muốn 1 hoặc 3 là chìa khóa. – Kevin

+0

@Kevin vâng, tôi nhớ mọi thứ tôi sẽ cập nhật, cảm ơn vì đã nhắc nhở – Kasramvd

4

Nếu các mục nhập khóa/giá trị trong danh sách của bạn x là khoảng cách đều nhau, đây là một cách khác để xây dựng từ điển. Nó sử dụng một vài trong số Python được xây dựng trong các tính năng và chức năng:

>>> keys = x[::3] 
>>> values = [map(int, pair) for pair in zip(x[1::3], x[2::3])] 
>>> dict(zip(keys, values)) 
{'a': [3, 4], 'b': [1, 2], 'c': [4, 5]} 

Để giải thích những gì đang được sử dụng ở đây:

  • danh sách cắt để tạo danh sách mới từ x: x[start:stop:step]
  • đây zip mất hai danh sách và tạo danh sách các bộ chứa các phần tử thứ n của mỗi danh sách
  • map(int, pair) chuyển một chuỗi các chuỗi chữ số thành danh sách các số nguyên
  • values được xây dựng với danh sách hiểu biết - những map chức năng được áp dụng cho mỗi cặp
  • dict biến một danh sách các cặp vào phím từ điển/giá trị
+0

wahat về nếu các giá trị là động ???, như 'a', 1,2, 'b', 4,5,6 ??? – Hackaholic

+1

Điều này chỉ giải quyết trường hợp của OP trong đó các mục có liên quan được khoảng cách đều nhau. Tôi sẽ làm rõ điều đó trong câu trả lời. –

1

Sử dụng itertools.groupby và một số công cụ iterator:

>>> from itertools import groupby 
>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)) 
>>> {k: next(it) for k in it} 
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]} 

Tại đây trình lặp đầu tiên sẽ mang lại một cái gì đó như:

>>> [next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)] 
['a', [3, 4], 'b', [1, 2], 'c', [4, 5]] 

Bây giờ khi trình vòng lặp này sẽ mang lại giá trị khóa luân phiên, chúng ta có thể lặp qua trình lặp này và lấy mục tiếp theo từ nó (i.e giá trị) sử dụng next()

>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)) 
>>> for k in it:                
    print k,'-->' ,next(it) 
...  
a --> [3, 4] 
b --> [1, 2] 
c --> [4, 5] 

Có một cách khác để tiêu thụ iterator này đó là sử dụng zip, nhưng đó là một little hard to understand IMO:

>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)) 
>>> dict(zip(*[it]*2)) 
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]} 
0

giải pháp đơn giản sử dụng chỉ dictlist:

>>> category = {} 
>>> for i in x: 
...  if i.isalpha(): 
...   items = category[i] = [] 
...  elif category: 
...   items.append(i) 
... 
>>> print(category) 
{'c': ['4', '5'], 'a': ['3', '4'], 'b': ['1', '2']} 
Các vấn đề liên quan