Hướng dẫn python filter array of dicts - mảng lọc của python

Tôi có một danh sách các từ điển và mỗi từ điển có một khóa (giả sử) 'Loại' có thể có giá trị là

keyValList = ['type2','type3']
2,
keyValList = ['type2','type3']
3, v.v. của một "loại" nhất định. Tôi nghĩ rằng tôi thực sự phải vật lộn với các toàn bộ
keyValList = ['type2','type3']
4.

Vì vậy, một danh sách ví dụ sẽ giống như:

exampleSet = [{'type':'type1'},{'type':'type2'},{'type':'type2'}, {'type':'type3'}]

Tôi có một danh sách các giá trị chính. Ví dụ, hãy nói:

keyValList = ['type2','type3']

nơi danh sách kết quả dự kiến ​​sẽ giống như:

expectedResult = [{'type':'type2'},{'type':'type2'},{'type':'type3'}]

Tôi biết tôi có thể làm điều này với một bộ cho các vòng lặp. Tôi biết phải có một cách đơn giản hơn mặc dù. Tôi đã tìm thấy rất nhiều hương vị khác nhau của câu hỏi này nhưng không có hương vị nào thực sự phù hợp với dự luật và trả lời câu hỏi. Tôi sẽ đăng một nỗ lực trong câu trả lời ... nhưng họ không ấn tượng như vậy. Có lẽ tốt nhất để để nó mở kết thúc. Bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao.

Hướng dẫn python filter array of dicts - mảng lọc của python

Bhargav Rao

47.7K27 Huy hiệu vàng122 Huy hiệu bạc137 Huy hiệu đồng27 gold badges122 silver badges137 bronze badges

Đã hỏi ngày 14 tháng 3 năm 2015 lúc 16:52Mar 14, 2015 at 16:52

Bạn có thể thử một danh sách comp

>>> exampleSet = [{'type':'type1'},{'type':'type2'},{'type':'type2'}, {'type':'type3'}]
>>> keyValList = ['type2','type3']
>>> expectedResult = [d for d in exampleSet if d['type'] in keyValList]
>>> expectedResult
[{'type': 'type2'}, {'type': 'type2'}, {'type': 'type3'}]

Một cách khác là sử dụng

keyValList = ['type2','type3']
5

>>> list(filter(lambda d: d['type'] in keyValList, exampleSet))
[{'type': 'type2'}, {'type': 'type2'}, {'type': 'type3'}]

Đã trả lời ngày 14 tháng 3 năm 2015 lúc 16:54Mar 14, 2015 at 16:54

Hướng dẫn python filter array of dicts - mảng lọc của python

Bhargav Raobhargav RaoBhargav Rao

47.7K27 Huy hiệu vàng122 Huy hiệu bạc137 Huy hiệu đồng27 gold badges122 silver badges137 bronze badges

3

Đã hỏi ngày 14 tháng 3 năm 2015 lúc 16:52

Bạn có thể thử một danh sách comp

Một cách khác là sử dụng

keyValList = ['type2','type3']
5

import pandas as pd

exampleSet = [{'type': 'type' + str(number)} for number in range(0, 1_000_000)]

keyValList = ['type21', 'type950000']


Đã trả lời ngày 14 tháng 3 năm 2015 lúc 16:54

%%timeit
expectedResult = [d for d in exampleSet if d['type'] in keyValList]

Bhargav Raobhargav Rao

Thử một vài câu trả lời từ bài đăng này, tôi đã kiểm tra hiệu suất của mỗi câu trả lời.

%%timeit
expectedResult = list(filter(lambda d: d['type'] in keyValList, exampleSet))

Như dự đoán ban đầu của tôi, độ hiểu hiểu danh sách nhanh hơn, phương pháp

keyValList = ['type2','type3']
5 và
keyValList = ['type2','type3']
7 đứng thứ hai và
keyValList = ['type2','type3']
8 đứng thứ ba cho đến nay.

Các biến được xác định:

%%timeit
df = pd.DataFrame(exampleSet)
expectedResult = df[df['type'].isin(keyValList)].to_dict('records')

1 -

keyValList = ['type2','type3']
9


60,7 ms ± 188 Pha mỗi vòng (trung bình ± std. Dev. Của 7 lần chạy, 10 vòng mỗi)

2nd -

keyValList = ['type2','type3']
5 và
keyValList = ['type2','type3']
7Oct 19, 2021 at 0:01

94 ms ± 328 Pha mỗi vòng (trung bình ± std. Dev. Của 7 lần chạy, 10 vòng mỗi)kovashikawa

Thứ 3 -

keyValList = ['type2','type3']
86 silver badges12 bronze badges

1

336 ms ± 1,84 ms mỗi vòng (trung bình ± std. Dev. Của 7 lần chạy, 1 vòng mỗi)

from itertools import ifilter
for elem in ifilter(lambda x: x['type'] in keyValList, exampleSet):
    print elem

Hướng dẫn python filter array of dicts - mảng lọc của python

Bhargav Rao

47.7K27 Huy hiệu vàng122 Huy hiệu bạc137 Huy hiệu đồng27 gold badges122 silver badges137 bronze badges

Đã hỏi ngày 14 tháng 3 năm 2015 lúc 16:52Mar 14, 2015 at 20:03

1

Bạn có thể thử một danh sách comp to

>>> exampleSet = [{'type':'type1'},{'type':'type2'},{'type':'type2'}, {'type':'type3'}]
>>> keyValList = ['type2','type3']
>>> expectedResult = [d for d in exampleSet if d['type'] in keyValList]
>>> expectedResult
[{'type': 'type2'}, {'type': 'type2'}, {'type': 'type3'}]
1

keyValList = ['type2','type3']
0

Một cách khác là sử dụng

keyValList = ['type2','type3']
5 / How to use

keyValList = ['type2','type3']
1

Đã trả lời ngày 14 tháng 3 năm 2015 lúc 16:54Jan 20 at 12:10

Hướng dẫn python filter array of dicts - mảng lọc của python

Bhargav Raobhargav Raopymen

Thử một vài câu trả lời từ bài đăng này, tôi đã kiểm tra hiệu suất của mỗi câu trả lời.40 silver badges33 bronze badges

Làm thế nào để bạn lọc một danh sách các đối tượng trong Python?

Lọc danh sách Python với bộ lọc () Chức năng (hàm, có thể lặp lại) có chức năng làm đầu vào đảm nhận đối số (phần tử danh sách) và trả về giá trị boolean cho dù phần tử danh sách này có chuyển bộ lọc hay không.Tất cả các phần tử vượt qua bộ lọc được trả về dưới dạng đối tượng mới có thể lặp lại (một đối tượng bộ lọc).filter() The filter(function, iterable) function takes a function as input that takes on argument (a list element) and returns a Boolean value whether this list element should pass the filter. All elements that pass the filter are returned as a new iterable object (a filter object).

Làm cách nào để sắp xếp một danh sách các từ điển trong Python?

Để sắp xếp một danh sách các từ điển theo giá trị của khóa cụ thể, chỉ định tham số khóa của phương thức Sắp xếp () hoặc hàm Sắp xếp ().Bằng cách chỉ định một hàm được áp dụng cho từng phần tử của danh sách, nó được sắp xếp theo kết quả của hàm đó.specify the key parameter of the sort() method or the sorted() function. By specifying a function to be applied to each element of the list, it is sorted according to the result of that function.

Làm thế nào để bạn chọn một giá trị từ một từ điển trong Python?

Trong Python, bạn có thể nhận được giá trị từ một từ điển bằng cách chỉ định khóa như Dict [Key].Trong trường hợp này, KeyError được nâng lên nếu khóa không tồn tại.Lưu ý rằng không có vấn đề gì khi chỉ định khóa không tồn tại nếu bạn muốn thêm một phần tử mới.specifying the key like dict[key] . In this case, KeyError is raised if the key does not exist. Note that it is no problem to specify a non-existent key if you want to add a new element.