найти совпадающие значения в списке словарей и соединить строки - PullRequest
0 голосов
/ 06 июня 2019

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

У меня есть список словарей, которые используют эту структуру:

word = {'word': 'Dog', 'loc': 160}

Они добавляются в список в цикле for:

words = []

for line in lines:
  word = {'word': line['WordText'], 'loc': line['Location']}
  ...
  words.append(word)

Каждая строка имеет целое число location, и мне нужно связать текст со строкой позже.

Мне нужно найти все экземпляры, в которых значение для ключа loc совпадает в списке, а затем как-то их спарить.

(Python) псевдокод:

new_lines = []

for word in words:
  new_line = {'line': '', 'loc': 0}
  if a_word['loc'] == another_word['loc']:
    new_line['line'] = a_word['word'] + another_word['word']
    new_line['loc'] = a_word['loc']
    new_lines.append(new_line)

IЯ знаю, что это неправильный подход, но мне нужно что-то вроде if any word['loc'] matches any other word['loc']: then put into list.

В случае, если неясно, я хочу объединить слова всловари, в которых совпадает значение loc .

Ответы [ 2 ]

1 голос
/ 06 июня 2019

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

from collections import defaultdict

lines = [{'WordText': 'dog',   'Location': 11},
         {'WordText': 'cow',   'Location': 222},
         {'WordText': 'cat',   'Location': 11},
         {'WordText': 'horse', 'Location': 222},
         {'WordText': 'duck',  'Location': 55},
         {'WordText': 'goat',  'Location': 222}]

wordsAtLoc = defaultdict(set)
for line in lines:
    wordsAtLoc[line['Location']].add(line['WordText'])
matches = { loc:list(words) for loc,words in wordsAtLoc.items() if len(words)>1 }   

print(matches)
# {11: ['cat', 'dog'], 222: ['goat', 'horse', 'cow']}
0 голосов
/ 06 июня 2019

Мне нужно найти в списке все случаи, когда значение для ключевого местоположения совпадает, а затем как-то их спарить.

Использовать dict по умолчанию для группировки слов по 'loc'.

с этим вы можете перебирать 'd' и делать то, что вам нравится делать.

from collections import defaultdict

d = defaultdict(list)

words = [{'word': 'fog', 'loc': 12}, {'word': 'bird', 'loc': 122}, {'word': 'bag', 'loc': 12},
         {'word': 'main', 'loc': 33}]

for word in words:
    d[word['loc']].append(word['word'])
print(d)

выход

defaultdict(<class 'list'>, {12: ['fog', 'bag'], 122: ['bird'], 33: ['main']})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...