Python фильтр списка с недавней датой - PullRequest
3 голосов
/ 21 января 2020

У меня есть список товаров с указанием их названия и времени. Я хочу создать список, в котором была найдена самая последняя дата для данного вида продукта. Мой первоначальный план состоит в том, чтобы создать подсписок для каждого вида продукта и получить самый последний из этого подсписка. Я хочу знать, есть ли более эффективный способ сделать это, поскольку в списке может быть больше.

products = [{'name': 'Veggie', 'time': '2020-01-06T07:53:29Z'},
            {'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'},
            {'name': 'Fruit', 'time': '2020-01-06T07:53:29Z'},
            {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]


Veggies = [x for x in products if x['name'] == 'Veggie']
...
new_products.append(get_recent(Veggies))

Желаемый результат:

new_products = [{'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'},
            {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 21 января 2020

Вот вариант использования collections.defaultdict:

from collections import defaultdict
from pprint import pprint

products = [
    {'name': 'Veggie', 'time': '2020-01-06T07:53:29Z'},
    {'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'},
    {'name': 'Fruit', 'time': '2020-01-06T07:53:29Z'},
    {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}
]

d = defaultdict(list)

for product in products:
    d[product['name']].append(product['time'])

new_products = [{'name': item, 'time': max(times)} for item, times in d.items()]

И результат будет:

pprint(new_products)
[{'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'},
 {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]
1 голос
/ 21 января 2020

Я думаю, что вам нужно сначала отсортировать данные, а затем уменьшить их, чтобы исключить повторяющиеся записи

from functools import reduce
from operator import itemgetter

products = [{'name': 'Veggie', 'time': '2020-01-06T07:53:29Z'},
            {'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'},
            {'name': 'Fruit', 'time': '2020-01-06T07:53:29Z'},
            {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]

def validate_unique_product(a, b):
    if b['name'] in map(lambda x: x['name'], a):
        return a
    a.append(b)
    return a


sorted_products = sorted(products, key=itemgetter('time'), reverse=True)
unique_products = reduce(validate_unique_product, sorted_products, [])

print(unique_products)

вывод

>> [{'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'}, {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]
1 голос
/ 21 января 2020

Вы можете заказать список словарей по любому желаемому ключу. В этом примере products (или Veggies) передается во встроенную функцию sorted (), которая принимает ключевое слово аргумента key. Itemgetter создает вызываемый объект, который принимает один элемент из массива product (или Veggies) и вводит его, и возвращает значение, которое будет использоваться в качестве основы для его сортировки.

from operator import itemgetter

products = [{'name': 'Veggie', 'time': '2020-01-06T07:53:29Z'},
            {'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'},
            {'name': 'Fruit', 'time': '2020-01-06T07:53:29Z'},
            {'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]

rows_by_date = sorted(products, key=itemgetter('time'))
print(rows_by_date)

OUTPUT

[{'name': 'Veggie', 'time': '2020-01-06T07:53:29Z'}, 
{'name': 'Fruit', 'time': '2020-01-06T07:53:29Z'}, 
{'name': 'Veggie', 'time': '2020-02-02T07:12:13Z'}, 
{'name': 'Fruit', 'time': '2020-02-02T07:12:13Z'}]


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...