Python - извлечение значений из вложенного списка - PullRequest
0 голосов
/ 30 марта 2020

У меня есть список, показанный ниже:

[{'id': 'id_123',
  'type': 'type_1',
  'created_at': '2020-02-12T17:45:00Z'},
 {'id': 'id_124',
  'type': 'type_2',
  'created_at': '2020-02-12T18:15:00Z'},
 {'id': 'id_125',
  'type': 'type_1',
  'created_at': '2020-02-13T19:43:00Z'},
 {'id': 'id_126',
  'type': 'type_3',
  'created_at': '2020-02-13T07:00:00Z'}]

Я пытаюсь найти, сколько раз type : type_1 встречается и какая самая ранняя отметка времени created_at в этом списке для type_1

Ответы [ 5 ]

1 голос
/ 30 марта 2020

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

l = [{'id': 'id_123',
  'type': 'type_1',
  'created_at': '2020-02-12T17:45:00Z'},
 {'id': 'id_124',
  'type': 'type_2',
  'created_at': '2020-02-12T18:15:00Z'},
 {'id': 'id_125',
  'type': 'type_1',
  'created_at': '2020-02-13T19:43:00Z'},
 {'id': 'id_126',
  'type': 'type_3',
  'created_at': '2020-02-13T07:00:00Z'}]

ll = [x for x in l if x['type'] == 'type_1']
ll.sort(key=lambda k: k['created_at'])
print(len(ll))
print(ll[0]['created_at'])

Вывод:

2
02/12/2020 17:45:00
1 голос
/ 30 марта 2020

Мы можем достичь этого за несколько шагов.

Чтобы узнать, сколько раз type_1 происходит, мы можем использовать встроенный filter в тандеме с itemgetter.

from operator import itemgetter

def my_filter(item):
    return item['type'] == 'type_1'

key = itemgetter('created_at')

items = sorted(filter(my_filter, data), key=key)
print(f"Num records is {len(items)}")
print(f"Earliest record is {key(items[0])}")

Num records is 2
Earliest record is 2020-02-12T17:45:00Z

И наоборот, вы можете использовать генератор-понимание и затем сортировать генератор.

gen = (item for item in data if item['type'] == 'type_1')
items = sorted(gen, key=key)
# rest of the steps are the same...
0 голосов
/ 30 марта 2020

Вы можете использовать следующую функцию для получения желаемого результата:

from datetime import datetime

def sol(l):
    sum_=0
    dict_={}

    for x in l:
        if x['type']=='type_1':
            sum_+=1
            dict_[x['id']]=datetime.strptime(x['created_at'], "%Y-%m-%dT%H:%M:%SZ")

    date =sorted(dict_.values())[0]
    for key,value in dict_.items():
        if value== date: id_=key
    return sum_,date,id_

sol(l)

Эта функция дает число раз type = 'type_1', соответствующую минимальную дату и ее идентификатор соответственно.

Надеюсь это поможет!

0 голосов
/ 30 марта 2020

Вы можете просто сгенерировать список всех type_1, используя list_comprehension, и они используют sort с datetime.strptime для сортировки значений соответственно

from datetime import datetime

# Generate a list with only the type_1s' created_at values
type1s = [val['created_at'] for val in vals if val['type']=="type_1"]

# Sort them based on the timestamps
type1s.sort(key=lambda date: datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ"))

# Print the lowest value
print(type1s[0])

#'2020-02-12T17:45:00Z'
0 голосов
/ 30 марта 2020

Это один подход с использованием filter и min.

Пример:

data = [{'id': 'id_123',
  'type': 'type_1',
  'created_at': '2020-02-12T17:45:00Z'},
 {'id': 'id_124',
  'type': 'type_2',
  'created_at': '2020-02-12T18:15:00Z'},
 {'id': 'id_125',
  'type': 'type_1',
  'created_at': '2020-02-13T19:43:00Z'},
 {'id': 'id_126',
  'type': 'type_3',
  'created_at': '2020-02-13T07:00:00Z'}]

onlytype_1 = list(filter(lambda x: x['type'] == 'type_1', data))
print(len(onlytype_1))
print(min(onlytype_1, key=lambda x: x['created_at']))

Или:

temp = {}
for i in data:
    temp.setdefault(i['type'], []).append(i)

print(len(temp['type_1']))
print(min(temp['type_1'], key=lambda x: x['created_at']))

Выход:

2
{'id': 'id_123', 'type': 'type_1', 'created_at': '2020-02-12T17:45:00Z'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...