пара значений уже существует в списке, если не добавить пару значений в список в python - PullRequest
0 голосов
/ 08 июля 2020

У меня есть список под названием my_list. my_list выглядит как показано ниже

my_list = ['apple','orange','pineapple','orange','banana']

Здесь мне нужно взять первый элемент списка, взять следующий элемент и создать пару, например, это может быть либо в dict, либо в кортеже ie [(apple,orange),(apple,pineapple),(apple,banana)]. Если пара уже существует, она не должна создавать новую. Как это сделать с python? Я пробовал это

my_new_list=[]
for i,value in enumerate(my_list):
    for j,second in enumerate(my_list):
        if ([value[i],second[j]) in my_new_list:
            pass
        else:
            my_new_list.append([value[i],second[j])

Получаю сообщение об ошибке. Как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 08 июля 2020

Используйте itertools.combinations вместе с set https://docs.python.org/3/library/itertools.html#itertools .combinations

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

Набор решает любые проблемы, которые могут возникнуть с дубликатами: ('apple','apple) или ('orange','apple') и ('apple','orange') не появятся.

import itertools

my_list = ['apple','orange','pineapple','orange','banana']
my_set = set(my_list)
my_combinations = list(intertools.combinations(my_set, 2))
1 голос
/ 08 июля 2020

Всегда лучше выполнять задание напрямую. В этом случае вам нужно только перебрать каждый список и добавить пару в новый список. Для получения индекса нет необходимости набирать enumerate(). Нет необходимости в выражении if. :

my_new_list=[]
for first in my_list:
    for second in my_list:
        my_new_list.append((first, second))

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

my_new_list=[]
for first in set(my_list):
    for second in my_list:
        my_new_list.append((first, second))

Если порядок результирующих пар не имеет значения и вы не можете иметь одновременно ('apple', 'orange') и ('orange', 'apple') в вашем окончательном списке, тогда внутренний l oop должен перебирать только часть списка:

my_new_list=[]
no_duplicates = list(set(my_list))
for i, first in enumerate(no_duplicates):
    for second in my_list[i+1:]:
        my_new_list.append((first, second))

Синтаксис my_list[i+1:] называется «срезом». Это говорит о получении остальных элементов, начиная с индекса i+1.

0 голосов
/ 08 июля 2020

Вы забыли закрыть пару скобок, и строки индексировать не нужно:

my_list = ['apple','orange','pineapple','orange','banana']

my_new_list=[]

for i,value in enumerate(my_list):
    for j,second in enumerate(my_list):
        if [value,second] in my_new_list:
            pass
        else:
            my_new_list.append([value,second])
            
print(my_new_list)

Вывод:

[['apple', 'apple'], ['apple', 'orange'], ['apple', 'pineapple'], ['apple', 'banana'], ['orange', 'apple'], ['orange', 'orange'], ['orange', 'pineapple'], ['orange', 'banana'], ['pineapple', 'apple'], ['pineapple', 'orange'], ['pineapple', 'pineapple'], ['pineapple', 'banana'], ['banana', 'apple'], ['banana', 'orange'], ['banana', 'pineapple'], ['banana', 'banana']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...