Связывание двух элементов в списке - PullRequest
0 голосов
/ 18 сентября 2018

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

list1

['5', 'orange', '20', 'apple', '50', 'blender']

list2

['25', 'blender', '20', 'pear', '40', 'spatula']

Вот мой код:

for item1 in list1[1::2]:
    for item2 in list2[1::2]:
        if item1 == item2:
            print(item1)

Этот код вернет блендер.Теперь я хочу также напечатать число перед блендером в каждом списке, чтобы получить вывод, подобный следующему:

blender, 50, 25

Я попытался добавить две новые строки в цикл for, но не получилжелаемый результат:

for item1 in list1[1::2]:
    for item2 in list2[1::2]:
        for num1 in list1[0::2]:
            for num2 in list2[0::2]:
               if item1 == item2:
                   print(item1, num1, num2)

Теперь я знаю, что создание циклов не является ответом.Также попытка вызвать item1 [-1] не работает.Я новичок в Python и мне нужна помощь с этим!

Спасибо

Ответы [ 6 ]

0 голосов
/ 18 сентября 2018

Я надеюсь, что этот код будет работать для вас.

l1 =['5', 'orange', '20', 'apple', '50', 'blender']
l2 = ['25', 'blender', '20', 'pear', '40', 'spatula']

for list1_item in zip(*[iter(l1)]*2):
    for list2_item in zip(*[iter(l2)]*2):
        if list1_item[1]==list2_item[1]:
            print list1_item[1],list1_item[0],list2_item[0]

он напечатает вывод

blender 50 25
0 голосов
/ 18 сентября 2018

Вы можете сделать это двумя способами, либо остаться со списками (что более запутанно):

list1 = ['5', 'orange', '20', 'apple', '50', 'blender']
list2 = ['25', 'blender', '20', 'pear', '40', 'spatula']
for item1 in list1[1::2]:
  for item2 in list2[1::2]:
    if item1 == item2:
       item_to_print = item1
       print(item1, ",", end="")
       for index in range(len(list1)):
           if list1[index] == item1:
               print(list1[index - 1], ",", end="")
       for index in range(len(list2)):
           if list2[index] == item1:
               print(list2[index - 1])

или лучше (на мой взгляд) со словарем:

dict1 = {'apple': '20', 'blender': '50', 'orange': '5'}
dict2 = {'blender': '25', 'pear': '20', 'spatula': '40'}
for item in dict1:
   if item in dict2:
       print(item, ",", dict1[item], ",", dict2[item])

Оба будут выводить:

>> blender , 50 , 25
0 голосов
/ 18 сентября 2018

с помощью enumerate вы можете решить вашу проблему:

list1 = ['5', 'orange', '20', 'apple', '50', 'blender']
list2 = ['25', 'blender', '20', 'pear', '40', 'spatula']



for n1, item1 in enumerate(list1[1::2]):
    for n2, item2 in enumerate(list2[1::2]):
        if item1 == item2:
            print(list1[n1*2], list2[n2*2], item1)

перечисление возвращает tuple, где первый элемент - это счетчик итерации, второй - элемент.
, поскольку enumerate считает итерацию, и вы шагаете 2, нам нужно умножить на 2:
orange будет первой итерацией, поэтому n1 будет 0, поэтому предыдущее значение по индексу 0*2
apple будет во второй итерации, поэтому n1 будет 1, поэтому предыдущее значение будет с индексом 1*2
blender будет в третьей итерации, поэтому n1 будет 2поэтому предыдущее значение находится в индексе 2*2.

это означает, что в for n1, item1 in enumerate(list1[1::2]): n1 и item1 будут установлены следующие значения:

Итерация 1: n1 = 0, item1 = orange, previous_index = 0 * 2
Итерация 2: n1 = 1, item1 = apple, previous_index = 1 * 2
Итерация 3: n1 = 2, item1 = blender, previous_index = 2 * 2

То же самое дляfor n2, item2 in enumerate(list2[1::2])::

Итерация 1: n2 = 0, item2 = blender, previous_index = 0 * 2
Итерация 2: n2 = 1, item2 = pear, previous_index = 1 * 2
Итерация 3: n2 = 2, item2 = шпатель, previous_index = 2 * 2

0 голосов
/ 18 сентября 2018

Я думаю, что вам лучше использовать словари для этой задачи ..

dict1 = {'orange': 5, 'apple': 20, 'blender': 50}
dict2 = {'blender': 25, 'pear': 20, 'spatula': 40}

, чтобы получить нужные результаты

>>dict1['blender']
50
>>dict2['blender']
25

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

print("blender, "+str(dict1['blender'])+", "+str(dict2['blender']))

, чтобы сделать этот шаг еще дальше и выводить на основе того, что в dict1 и dict2

for i in dict1.keys(): #dict1.keys() is essentially a list with ['orange','apple','blender']
    if i in dict2.keys(): #same deal, but different items in the list
        print(str(i)+", "+str(dict1[i])+", "+str(dict2[i])) #this outputs items that are in BOTH lists
    else:
        print(str(i)+", "+str(dict1[i])) #this outputs items ONLY in dict1
for i in dict2.keys():
    if i not in dict1.keys(): #we use not since we already output the matching in the previous loop
        print(str(i)+", "+str(dict2[i])) #this outputs items ONLY in dict2

Выходы:

orange, 5
apple, 20
blender, 50, 25
pear, 20
spatula, 40
0 голосов
/ 18 сентября 2018

Предполагая, что существительные в ваших списках уникальны (для каждого списка), сначала создайте словари из своих списков.

In [1]: list1 = ['5', 'orange', '20', 'apple', '50', 'blender']
In [2]: list2 = ['25', 'blender', '20', 'pear', '40', 'spatula']
In [3]: 
In [3]: dict1 = dict(reversed(pair) for pair in zip(*[iter(list1)]*2))
In [4]: dict2 = dict(reversed(pair) for pair in zip(*[iter(list2)]*2))
In [5]: 
In [5]: dict1
Out[5]: {'apple': '20', 'blender': '50', 'orange': '5'}
In [6]: dict2
Out[6]: {'blender': '25', 'pear': '20', 'spatula': '40'}

Этот код использует рецепт grouper из документов itertools.

Совпадение двух элементов из ваших словарей просто как пирог.

In [7]: key = 'blender'
In [8]: print(key, dict1[key], dict2[key])
blender 50 25

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

In [12]: common = dict1.keys() & dict2
In [13]: {c:[dict1[c], dict2[c]] for c in common}
Out[13]: {'blender': ['50', '25']}

Для произвольного числа диктов это можно дополнительно абстрагировать.

In [28]: from functools import reduce
In [29]: from operator import and_
In [30]: 
In [30]: dicts = (dict1, dict2)
In [31]: common = reduce(and_, map(set, dicts))
In [32]: {c:[d[c] for d in dicts] for c in common}
Out[32]: {'blender': ['50', '25']}
0 голосов
/ 18 сентября 2018

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

Настройка

Вы можете использовать zip для создания этих двух словарей:

a = ['5', 'orange', '20', 'apple', '50', 'blender']
b = ['25', 'blender', '20', 'pear', '40', 'spatula']

dct_a = dict(zip(a[1::2], a[::2]))
dct_b = dict(zip(b[1::2], b[::2]))

Это оставит вас с этими двумя словарями:

{'orange': '5', 'apple': '20', 'blender': '50'}
{'blender': '25', 'pear': '20', 'spatula': '40'}

Это облегчит решение каждой части вашей проблемы.Например, чтобы найти общие ключи:

common = dct_a.keys() & dct_b.keys()
# {'blender'}

И найти все значения, соответствующие каждому общему ключу:

[(k, dct_a[k], dct_b[k]) for k in common]

Вывод:

[('blender', '50', '25')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...