Взятие двух значений из двух списков (случайный порядок) кортежей и умножение - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть два списка, и они являются списками кортежей.

Например,

List1 = [('zaidan', 0.0013568521031207597),('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279)]
List2 = [('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279), ('zaidan', 0.0013568521031207597)]

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

val = [(t1, v1*v2) for (t1, v1), (t2, v2) in zip(tf,idf)]

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

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Если по какой-либо причине вы не хотите использовать словарь (хотя это превосходное решение), но хотите сделать это со списками и кортежами, вам нужно пройтись по спискам и проверить на равенство:

x = [('zaidan', 0.0013568521031207597),('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279)]

y = [('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279), ('zaidan', 0.0013568521031207597)]

z = []
for item in x:
    for _item in y:
        if item[0] == _item[0]
            z.append((item[0], item[1]*_item[1]))

В конце z будет списком кортежей с исходной строкой по индексу 0 и результатом умножения по индексу 1.

0 голосов
/ 21 февраля 2019

Я бы сказал вам самое простое решение, если ваши данные совпадают.просто сортируй это:

ls1 = sorted(ls1, key=lambda tup: tup[0])
ls2 = sorted(ls2, key=lambda tup: tup[0])

val = [(t1, v1*v2) for (t1, v1), (t2, v2) in zip(ls1,ls2)]
0 голосов
/ 21 февраля 2019

Этот вопрос превосходно демонстрирует преимущества структуры данных dictionary и то, как ваша проблема может извлечь из этого пользу.Итак, сначала мы конвертируем ваш список кортежей в словари (dict -calls), а затем вы «комбинируете» два диктанта в соответствии с вашим требованием для получения желаемого результата.

lst1 = [('zaidan', 0.0013568521031207597),('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279)]

lst2 = [('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279), ('zaidan', 0.0013568521031207597)]

dct1 = dict(lst1)
dct2 = dict(lst2)

res = {k: v * dct2.get(k, 1) for k, v in dct1.items()}.items()

, который дает:

dict_items([('zaidan', 1.8410476297432288e-06), ('zimmerman', 1.8410476297432288e-06), ('ypa', 1.656942866768906e-05)])

А если тип данных dict_item сбивает с толку, вы всегда можете привести его к списку ванили.

res = list(res)
print(res)
# [('zaidan', 1.8410476297432288e-06), ('zimmerman', 1.8410476297432288e-06), ('ypa', 1.656942866768906e-05)]
...