Сравните словари в списке Python и добавьте результаты - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь выполнить l oop через массив словарей, сравнить каждое значение между ними и затем добавить результаты в словарь.

, например, если у нас есть следующий массив:

epidemics = [{"Disease": "B", "year": "1980"},
             {"Disease": "C", "year": "1975"},
             {"Disease": "B", "year": "1996"},
             {"Disease": "E", "year": "2000"},
             {"Disease": "B", "year": "2020"}]

если эпидемия c того же заболевания произошла и в другие годы, я пытаюсь достичь результата:

 epidemics = [{"Disease": "B", "year": "1980", "occurredIn": ["1996", "2020"]},
             {"Disease": "C", "year": "1975"},
             {"Disease": "B", "year": "1996", "occurredIn": ["1980", "2020"]},
             {"Disease": "E", "year": "2000"},
             {"Disease": "B", "year": "2020", "occurredIn": ["1980", "1996"]}]

вот где я дошел:

for index, a in enumerate(epidemics):
  v_b = []

  for b in epidemics[index+1:]:
    if a['Disease'] == b['Disease']:
        v_b.append(b["year"])
        a['occurredIn'] = v_b

это печатает меня:

[{'Disease': 'B', 'year': '1980', 'occurredIn': ['1996', '2020']},
 {'Disease': 'C', 'year': '1975'},
 {'Disease': 'B', 'year': '1996', 'occurredIn': ['2020']},
 {'Disease': 'E', 'year': '2000'}, 
 {'Disease': 'B', 'year': '2020'}]

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

Ответы [ 2 ]

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

Вы можете создать новый словарь, основанный на годах возникновения болезни, например:

epidemics = [{"Disease": "B", "year": "1980"},
             {"Disease": "C", "year": "1975"},
             {"Disease": "B", "year": "1996"},
             {"Disease": "E", "year": "2000"},
             {"Disease": "B", "year": "2020"}]

output = []
for ep in epidemics:
    other_years = set(
        other_ep['year'] for other_ep in epidemics if (
            ep['Disease'] == other_ep['Disease'] and ep['year'] != other_ep['year']
            )
    )

    output.append(
        ep if not other_years else {**ep, 'occurredIn': list(other_years)}
    )

print(output)
>>> {'Disease': 'B', 'year': '1980', 'occurredIn': ['2020', '1996']}
>>> {'Disease': 'C', 'year': '1975'}
>>> {'Disease': 'B', 'year': '1996', 'occurredIn': ['1980', '2020']}
>>> {'Disease': 'E', 'year': '2000'}
>>> {'Disease': 'B', 'year': '2020', 'occurredIn': ['1980', '1996']}
0 голосов
/ 14 марта 2020

Вы можете создать временный словарь и набор лет для каждой болезни. Затем, используя этот словарь, измените список epidemics:

from collections import defaultdict

epidemics = [{"Disease": "B", "year": "1980"},
             {"Disease": "C", "year": "1975"},
             {"Disease": "B", "year": "1996"},
             {"Disease": "E", "year": "2000"},
             {"Disease": "B", "year": "2020"}]

d = defaultdict(set)
for dd in epidemics:
    disease = dd['Disease']
    d[disease].add(dd['year'])

for i,dd in enumerate(epidemics):
    years = d[dd['Disease']]-set([dd['year']])
    if years:
        epidemics[i]['occurredIn'] = years

print(epidemics)

Вывод:

[{'Disease': 'B', 'year': '1980', 'occurredIn': {'2020', '1996'}},
 {'Disease': 'C', 'year': '1975'},
 {'Disease': 'B', 'year': '1996', 'occurredIn': {'1980', '2020'}},
 {'Disease': 'E', 'year': '2000'},
 {'Disease': 'B', 'year': '2020', 'occurredIn': {'1980', '1996'}}]
...