Python3 объединить кортежи в список и удалить дубликаты - PullRequest
1 голос
/ 10 марта 2020

Возможно, в прошлом задавался аналогичный запрос, но я не смог найти тот, который искал,

Input = [('Icecream', 'Vanilla'), ('Icecream', 'Chocolate'), ('Icecream', 'Strawberry')]
Output = [('Icecream', ['Vanilla', 'Chocolate', 'Strawberry'])]

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

Список ввода может содержать больше элементов, как показано ниже,

Input = [('Icecream', 'Vanilla'), ('Icecream', 'Chocolate'), ('Icecream', 'Strawberry'), ('Veggie', 'Carrot'), ('Milk', 'whole'), ('Milk', 'formula')]

Output = [('Icecream', ['Vanilla', 'Chocolate', 'Strawberry']), ('Veggie', ['Carrot']), ('Milk', ['whole', 'formula'])]

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Я думаю, что лучший подход к вашей проблеме - преобразовать Вход в словарь .

Input = [('Icecream', 'Vanilla'), ('Icecream', 'Chocolate'), ('Icecream', 'Strawberry'), ('Veggie', 'Carrot'), ('Milk', 'whole'), ('Milk', 'formula')]

new_dict = {}
for item in Input:
    key, *values = item
    if key not in new_dict:
        new_dict[key] = []
    new_dict[key].append(*values)
print(new_dict)

Выход:

{'Icecream': ['Vanilla', 'Chocolate', 'Strawberry'], 'Veggie': ['Carrot'], 'Milk': ['whole', 'formula']}

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

icecream_flavors = new_dict["Icecream"]
print(icecream_flavors)

Вывод:

['Vanilla', 'Chocolate', 'Strawberry']

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

new_list = list(new_dict.items())
print(new_list)

Вывод:

[('Icecream', ['Vanilla', 'Chocolate', 'Strawberry']), ('Veggie', ['Carrot']), ('Milk', ['whole', 'formula'])]
0 голосов
/ 10 марта 2020

Для этого есть 2 разных решения. Могут ли элементы кортежа обмениваться друг с другом? Вот так

Input = [('Vanilla', 'Icecream'), ('Icecream', 'Chocolate'), ('Icecream', 'Strawberry')]

Если нет, ответ прост. Вы можете использовать счетчик и некоторое время l oop (использование l oop важно, поскольку для l oop обхода внутри клона списка, насколько я помню в python, так что это может быть проблемой), чтобы пройти в списке для каждого элемента отметьте остальные элементы. Давайте закодируем его.

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

Input = [('Icecream', ['Vanilla']), ('Icecream', ['Chocolate']), ('Icecream', ['Strawberry'])]

Для этого все должно работать

for tuple in Input:
    tuple[1] = [tuple[1]]

После организации нашего ввода теперь мы можем делать то, что вы хотите

counter = 0
while counter<len(Input):
    for tuple in Input[counter+1:]:
        if Input[counter][0] == tuple[0]:
            Input[counter][1].append(tuple[1][0])
            Input.remove(tuple)
counter = counter+1

Я не пробовал (так что могут быть ошибки), но я надеюсь, что вы понимаете, что я пытался сделать. Я уверен, что вы можете реализовать его в своем собственном коде со своим собственным стилем.

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

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

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

Input = [('Icecream', 'Vanilla'), ('Icecream', 'Chocolate'), ('Icecream', 'Strawberry')]

flavors = []
for i in Input:
    if i[1] not in flavors:
        flavors.append(i[1])

Output = [(Input[0][0], flavors)]
...