2009-08-05 29 views
30

Tôi đang tìm kiếm một cách để chuyển đổi danh sách các hàng mà trông như thế này:PYTHON: Chuyển đổi danh sách các hàng vào một cuốn từ điển

[(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 

vào một cuốn từ điển, nơi quan trọng: giá trị cặp ngoại hình như thế này:

{4:[1,2,3] ,15:[4,5,9,11,12], 23:[6,7,8,10]} 

Yếu tố thứ hai từ bộ trở thành một khóa từ điển. Phần tử tuple đầu tiên được gán cho khóa đó.

Bạn có thể chỉ cho tôi cách thực hiện điều đó không?

+1

Tại sao bạn muốn danh sách từ điển mà mỗi từ điển chỉ có một khóa/giá trị? Bạn có chắc bạn không chỉ muốn một từ điển? – FogleBird

+0

Có, bạn đã đúng FogleBird. Tôi đã tìm kiếm từ điển cuối cùng. Cảm ơn bạn đã chỉ ra rằng ... – elfuego1

+21

Đánh giá theo số lượt xem, hầu hết mọi người (như tôi) đã tìm kiếm cách chuyển đổi 'myList = [(key1, val1), (key2, val2), ...] 'cho một dict:' {key1: val1, key2: val2 ...} '. Đối với điều này, chỉ cần làm 'dict (myList)' – mindthief

Trả lời

43
>>> from collections import defaultdict 
>>> l= [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
>>> d= defaultdict(list) 
>>> for v, k in l: 
...  d[k].append(v) 
... 
>>> d 
defaultdict(<type 'list'>, {23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]}) 
>>> [ {k:d[k]} for k in sorted(d) ] 
[{4: [1, 2, 3]}, {15: [4, 5, 9, 11, 12]}, {23: [6, 7, 8, 10]}] 
+0

+1 cho việc sử dụng defaultdict. Nhiều hơn mượt mà hơn gọi 'setdefault()' mỗi lần. –

+0

Bộ sưu tập tình yêu.defaultdict. đó là lớp học của tôi cho rất nhiều công việc. – hughdbrown

2
l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
d = {} 
for v, k in l: 
    d.setdefault(k, []).append(v) 
+0

Bằng cách sao chép việc sử dụng setdefault trong chỉnh sửa của bạn, hiện tại có ít tùy chọn hơn cho cử tri chọn từ ... – FogleBird

+2

Tôi thực sự không sao chép nó. Tôi nhận ra tôi có thể sử dụng setdefault cũng như chỉ sau khi đăng và cập nhật bởi bài vì tôi thích nó tốt hơn. – c089

+0

Không sao cả. Dù sao cũng không sai khi sửa thêm ý tưởng khác, nhưng thường thì nó được thực hiện để thêm thông tin, chứ không phải tạo câu trả lời trùng lặp. Nhưng tôi hiểu rằng bạn không sao chép của tôi. – FogleBird

2
tuples = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
dicts = {} 
for elem in tuples: 
    try: 
     dicts[elem[1]].append(elem[0]) 
    except KeyError: 
     dicts[elem[1]] = [elem[0],] 
+1

Sử dụng giải nén trong vòng lặp của bạn. Và không cần dấu phẩy trong danh sách một mục (chỉ các bộ dữ liệu). Và sử dụng một ngoại lệ ở đây là ổn hơn trong Python so với các ngôn ngữ khác nhưng vẫn còn một chút ngớ ngẩn trong trường hợp này. – FogleBird

+2

Ngoại lệ không phải là ngớ ngẩn - đó là cách defaultdict thực hiện điều đó. Tôi đồng ý về việc giải nén mặc dù. – xorsyst

12
>>> a = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
>>> b = {} 
>>> for i, j in a: 
...  b.setdefault(j, []).append(i) 
... 
>>> b 
{23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]} 
>>> 
+0

Cảm ơn bạn rất nhiều! – elfuego1

+0

Brilliant! Tôi vừa học được một hoạt động dict mới ngày hôm nay - setdefault. Điều đó sẽ dọn dẹp mã của tôi một chút! Chúc mừng. +1 –

+3

@Steve Folly: Nhìn vào collections.defaultdict. Nó còn tốt hơn nữa. –

2

này sẽ làm:

from collections import defaultdict 

def to_list_of_dicts(list_of_tuples): 
    d = defaultdict(list) 
    for x, y in list_of_tuples: 
     d[y].append(x) 
    return sorted([{x: y} for (x, y) in d.items()]) 
2

Nó không ưa thích nhưng nó là đơn giản

l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
d = dict((k, [i[0] for i in l if i[1] == k]) for k in frozenset(j[1] for j in l)) 

Huzzah!

Các vấn đề liên quan