Hướng dẫn split list of dictionaries python - tách danh sách từ điển python

Tôi đã đánh bại điều này trong một thời gian không có kết quả ... bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

Tôi có:

[{'event': 0, 'voltage': 1, 'time': 0},
{'event': 0, 'voltage': 2, 'time': 1},
{'event': 1, 'voltage': 1, 'time': 2},
{'event': 1, 'voltage': 2, 'time': 3},
{'event': 2, 'voltage': 1, 'time': 4},
{'event': 2, 'voltage': 2, 'time': 5},
...]

Và tôi muốn phân chia danh sách từ điển đó cho mỗi sự kiện như thế này (có thể có nhiều sự kiện tùy ý):

list0 = [{'event': 0, 'voltage': 1, 'time': 0},
{'event': 0, 'voltage': 2, 'time': 1}]

list1 = [{'event': 1, 'voltage': 1, 'time': 2},
{'event': 1, 'voltage': 2, 'time': 3}]

list2 = [{'event': 2, 'voltage': 1, 'time': 4},
{'event': 2, 'voltage': 2, 'time': 5}]

listN = ...

Đã hỏi ngày 3 tháng 11 năm 2010 lúc 21:06Nov 3, 2010 at 21:06

Hướng dẫn split list of dictionaries python - tách danh sách từ điển python

Thenicknamethenicknamethenickname

6.46414 Huy hiệu vàng40 Huy hiệu bạc42 Huy hiệu đồng14 gold badges40 silver badges42 bronze badges

Sử dụng defaultdict

import collections

result = collections.defaultdict(list)

for d in dict_list:
    result[d['event']].append(d)

result_list = result.values()        # Python 2.x
result_list = list(result.values())  # Python 3

Bằng cách này, bạn không phải đưa ra bất kỳ giả định nào về việc có bao nhiêu sự kiện khác nhau hoặc nếu có bất kỳ sự kiện nào bị thiếu.

Điều này cung cấp cho bạn một danh sách các danh sách. Nếu bạn muốn một sự kiện được lập chỉ mục, tôi có thể sẽ sử dụng

list0 = [{'event': 0, 'voltage': 1, 'time': 0},
{'event': 0, 'voltage': 2, 'time': 1}]

list1 = [{'event': 1, 'voltage': 1, 'time': 2},
{'event': 1, 'voltage': 2, 'time': 3}]

list2 = [{'event': 2, 'voltage': 1, 'time': 4},
{'event': 2, 'voltage': 2, 'time': 5}]

listN = ...
0 nếu bạn có kế hoạch thực hiện bất kỳ quyền truy cập ngẫu nhiên nào.

Theo như xây dựng một loạt các danh sách cá nhân, tôi nghĩ rằng đó là một ý tưởng tồi. Nó sẽ bắt buộc phải tạo ra chúng như toàn cầu hoặc sử dụng

list0 = [{'event': 0, 'voltage': 1, 'time': 0},
{'event': 0, 'voltage': 2, 'time': 1}]

list1 = [{'event': 1, 'voltage': 1, 'time': 2},
{'event': 1, 'voltage': 2, 'time': 3}]

list2 = [{'event': 2, 'voltage': 1, 'time': 4},
{'event': 2, 'voltage': 2, 'time': 5}]

listN = ...
1 (hoặc nhận hacky theo một cách khác) trừ khi bạn biết chính xác có bao nhiêu người mà bạn tuyên bố không. Tốt nhất là chỉ giữ chúng trong một container.

Hướng dẫn split list of dictionaries python - tách danh sách từ điển python

JPP

153K32 Huy hiệu vàng262 Huy hiệu bạc320 Huy hiệu đồng32 gold badges262 silver badges320 bronze badges

Đã trả lời ngày 3 tháng 11 năm 2010 lúc 21:12Nov 3, 2010 at 21:12

Aaronasterlingaaronasterlingaaronasterling

67K20 Huy hiệu vàng125 Huy hiệu bạc125 Huy hiệu Đồng20 gold badges125 silver badges125 bronze badges

0

Cái này là

list0 = [{'event': 0, 'voltage': 1, 'time': 0},
{'event': 0, 'voltage': 2, 'time': 1}]

list1 = [{'event': 1, 'voltage': 1, 'time': 2},
{'event': 1, 'voltage': 2, 'time': 3}]

list2 = [{'event': 2, 'voltage': 1, 'time': 4},
{'event': 2, 'voltage': 2, 'time': 5}]

listN = ...
2 vì loại, nhưng tôi sẽ không lo lắng quá nhiều trừ khi có nhiều mục trong danh sách.

Nó danh sách đã được sắp xếp theo sự kiện, bạn có thể bỏ qua loại khóa học.

>>> from operator import itemgetter
>>> from itertools import groupby
>>> d=[{'event': 0, 'voltage': 1, 'time': 0},
... {'event': 0, 'voltage': 2, 'time': 1},
... {'event': 1, 'voltage': 1, 'time': 2},
... {'event': 1, 'voltage': 2, 'time': 3},
... {'event': 2, 'voltage': 1, 'time': 4},
... {'event': 2, 'voltage': 2, 'time': 5}]
>>> groupby(sorted(d, key=itemgetter('event')), key=itemgetter('event'))

>>> for x in _:
...   print x[0], list(x[1])
... 
0 [{'time': 0, 'event': 0, 'voltage': 1}, {'time': 1, 'event': 0, 'voltage': 2}]
1 [{'time': 2, 'event': 1, 'voltage': 1}, {'time': 3, 'event': 1, 'voltage': 2}]
2 [{'time': 4, 'event': 2, 'voltage': 1}, {'time': 5, 'event': 2, 'voltage': 2}]

oz123

26.5K25 Huy hiệu vàng127 Huy hiệu bạc183 Huy hiệu Đồng25 gold badges127 silver badges183 bronze badges

Đã trả lời ngày 3 tháng 11 năm 2010 lúc 22:23Nov 3, 2010 at 22:23

Hướng dẫn split list of dictionaries python - tách danh sách từ điển python

John La Rooyjohn La RooyJohn La Rooy

288K51 Huy hiệu vàng359 Huy hiệu bạc500 Huy hiệu Đồng51 gold badges359 silver badges500 bronze badges

dict_list = [{'event': 0, 'voltage': 1, 'time': 0},
{'event': 0, 'voltage': 2, 'time': 1},
{'event': 1, 'voltage': 1, 'time': 2},
{'event': 1, 'voltage': 2, 'time': 3},
{'event': 2, 'voltage': 1, 'time': 4},
{'event': 2, 'voltage': 2, 'time': 5},
]

import collections
dol = collections.defaultdict(list)
for d in dict_list:
   k = d["event"]
   dol[k].append(d)

print dol

Nếu bạn biết rằng các khóa "sự kiện" của bạn là các số nguyên dựa trên không liên tiếp, bạn có thể sử dụng danh sách thay thế, nhưng độ phức tạp thêm có thể không đạt được bất cứ điều gì.

DefaultDict đã được thêm vào trong Python 2.5, nhưng cách giải quyết cho các phiên bản trước không khó (xem mã Nick D'S).

Đã trả lời ngày 3 tháng 11 năm 2010 lúc 21:21Nov 3, 2010 at 21:21

Tôi nghĩ những gì bạn thực sự muốn là lọc chúng:

elist = [{'event': 0, 'voltage': 1, 'time': 0},
{'event': 0, 'voltage': 2, 'time': 1},
{'event': 1, 'voltage': 1, 'time': 2},
{'event': 1, 'voltage': 2, 'time': 3},
{'event': 2, 'voltage': 1, 'time': 4},
{'event': 2, 'voltage': 2, 'time': 5}]


from itertools import ifilter

def get_events(elist, n):
    return ifilter( lambda d: d['event'] == n , elist)

for e in get_events(elist,0):
    print e

Giải pháp này sẽ không tạo ra các cấu trúc bổ sung. (suy nghĩ trong trường hợp danh sách sự kiện lớn)

Một giải pháp rất hay khác là sử dụng Groupby:

from itertools import groupby
from operator import itemgetter
for group in groupby(elist, itemgetter('event')):
    id, event_list = group
    for e in event_list:
        print e

{'time': 0, 'event': 0, 'voltage': 1}
{'time': 1, 'event': 0, 'voltage': 2}
{'time': 2, 'event': 1, 'voltage': 1}
{'time': 3, 'event': 1, 'voltage': 2}
{'time': 4, 'event': 2, 'voltage': 1}
{'time': 5, 'event': 2, 'voltage': 2}

Đã trả lời ngày 3 tháng 11 năm 2010 lúc 22:05Nov 3, 2010 at 22:05

FabriziomfabriziomfabrizioM

45.2K15 Huy hiệu vàng98 Huy hiệu bạc117 Huy hiệu đồng15 gold badges98 silver badges117 bronze badges

0

Một triển khai đơn giản sẽ đủ theo quan điểm của tôi:

grouping = {}    
for d in dictlist:
    if d[field] not in grouping:
        grouping[d[field]] = []
    grouping[d[field]].append(d)
result = list(result.values())

Đã trả lời ngày 18 tháng 8 năm 2019 lúc 15:01Aug 18, 2019 at 15:01

Daniel Braundaniel BraunDaniel Braun

2.01324 Huy hiệu bạc24 Huy hiệu đồng24 silver badges24 bronze badges