Пересечь список диктов на основе общего ключа - PullRequest
0 голосов
/ 04 января 2011

Допустим, у меня есть два списка диктовок:

dates = [{'created':'2010-12-01'},{'created':'2010-12-02'},....]
elts = [{'created':'2010-12-01', 'key1':'val1', 'key2':'val2'}, {'created':'2010-12-05','key1':'val1'}]

Список дат представляет собой набор смежных дат.

Список elts может быть от 1 до len (даты)и то, что я хочу сделать, - это в основном пад-эльты, чтобы у них был дикт для даты независимо от того, есть ли другие ключи.

Это мое наивное решение:

for d in dates:
    for e in elts:
        if d['created'] == e['created']:
            d.update(dict(key1=e['key1']))

У меня будет окончательный array d со всеми датами в каждом dict, но могут быть / не могут быть другие ключи / значения.

Что такое хорошее «питоническое» решение?

Ответы [ 4 ]

3 голосов
/ 04 января 2011

Ваш вопрос немного отклонен, я думаю, поскольку ваше решение, похоже, на самом деле не решает ваш вопрос, но если вы хотите создать запись в elts для каждой даты в dates, которая еще не появляетсяв elts вы можете использовать это:

all_dates = set(e['created'] for e in dates) # gets a list of all dates that exist in `dates`
elts_dates = set(e['created'] for e in elts) # same for elts

missing_dates = all_dates - elts_dates

for entry in missing_dates:
    elts.append(dict(created=entry))

Вот фрагмент http://codepad.org, который показывает этот фрагмент в действии: http://codepad.org/n4NbjvPM

2 голосов
/ 04 января 2011

РЕДАКТИРОВАТЬ: другое решение:

Составьте список дат, которые у вас уже есть:

dates_in_elts = set(e['created'] for e in elts)

for d in dates:
    if d['created'] not in dates_in_elts:
        e.append(d)

Это повторяет каждый список только один раз, а не повторяет elts для каждой даты в датах.

1 голос
/ 04 января 2011

Я бы, вероятно, вместо этих списков сделал словари.

  dates_d = dict([(x['created'], x) for x in dates])
  elts_d = dict([(x['created'], x) for x in elts])
  dates_d.update(elts_d)

Если вам нужно, чтобы он снова представлял собой список диктов, вы можете сделать это легко:

  dates = [dates_d[x] for x in sorted(dates_d)]

Если вы не делаете ничего, кроме как объединяете их, ваше решение может быть более легко читаемым. Но я подозреваю, что списки словарей - не очень удобный формат для данных.

0 голосов
/ 04 января 2011

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

>>> for d in dates:
...    for e in elts:
...       if d['created'] == e['created']:
...          d.update(e)

В этот момент это словарь date , который отражает то, что я думаю вы хотите.

...