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

Я хотел бы удалить дубликаты из столбца 1 и вернуть в столбец 2 связанный список значений, связанных с каждым уникальным элементом, используя python.

Вход

1 2
Jack London 'Son of the Wolf'
Jack London 'Chris Farrington'
Jack London 'The God of His Fathers'
Jack London 'Children of the Frost'
William Shakespeare  'Venus and Adonis' 
William Shakespeare 'The Rape of Lucrece'
Oscar Wilde 'Ravenna'
Oscar Wilde 'Poems'

в то время как выход должен быть

1 2
Jack London 'Son of the Wolf, Chris Farrington, Able Seaman, The God of His Fathers,Children of the Frost'
William Shakespeare 'The Rape of Lucrece,Venus and Adonis' 
Oscar Wilde 'Ravenna,Poems'

где второй столбец содержит сумму значений, связанных с каждым элементом. Я попробовал функцию set() в словаре

dic={'Jack London': 'Son of the Wolf', 'Jack London': 'Chris Farrington', 'Jack London': 'The God of His Fathers'}
set(dic)

но он вернул только первый ключ словаря

set(['Jack London'])

person user3184877    schedule 23.01.2015    source источник
comment
Как вы делите столбцы?   -  person Adam Smith    schedule 24.01.2015
comment
@AdamSmith Я не думаю, что это имеет значение, он не спрашивает, как анализировать ввод.   -  person augurar    schedule 24.01.2015
comment
Заманчиво просто написать код, который будет делать это за вас, но я не думаю, что вы или я многому на этом научимся. Вот пример, который, я думаю, будет полезен: docs.python.org /2/library/collections.html#defaultdict-examples   -  person spirulence    schedule 24.01.2015


Ответы (2)


Вы должны использовать itertools.groupby, так как ваш список отсортирован.

rows = [('1', '2'),
        ('Jack London', 'Son of the Wolf'),
        ('Jack London', 'Chris Farrington'),
        ('Jack London', 'The God of His Fathers'),
        ('Jack London', 'Children of the Frost'),
        ('William Shakespeare', 'Venus and Adonis'),
        ('William Shakespeare', 'The Rape of Lucrece'),
        ('Oscar Wilde', 'Ravenna'),
        ('Oscar Wilde', 'Poems')]
# I'm not sure how you get here, but that's where you get

from itertools import groupby
from operator import itemgetter

grouped = groupby(rows, itemgetter(0))
result = {group:', '.join([value[1] for value in values]) for group, values in grouped}

Это дает вам результат:

In [1]: pprint(result)
{'1': '2',
 'Jack London': 'Son of the Wolf, Chris Farrington, The God of His Fathers, '
                'Children of the Frost',
 'Oscar Wilde': 'Ravenna, Poems',
 'William Shakespeare': 'Venus and Adonis, The Rape of Lucrece'}
person Adam Smith    schedule 23.01.2015
comment
Я думаю, что следующие результаты ближе к желаемой спецификации: result = {group:[x[1:][0] for x in values] for group,values ​​in grouped} - person Jim Dennis; 24.01.2015
comment
@ДжимДеннис Верно. Я, наверное, даже должен сделать data = {group:[col[1] for col in values] for group,values in grouped}; result = "{} {}".format(row[0], ' '.join(row[1:]) for row in data) - person Adam Smith; 24.01.2015
comment
Да, технически он говорит, что вывод должен быть... но я предполагаю, что на самом деле его больше интересует результирующая структура данных, а не буквальный вывод. Мое предложение и ответ авгурара, за который я проголосовал, основаны на такой интерпретации его вопроса, а не на буквальном запросе вывода. - person Jim Dennis; 24.01.2015

В Python словарь может содержать только одно значение для каждого ключа. Но это значение может быть набором элементов:

>>> d = {'Jack London': ['Son of the Wolf', 'Chris Farrington']}
>>> d['Jack London']
['Son of the Wolf', 'Chris Farrington']

Чтобы создать такой словарь из последовательности пар ключ-значение, вы можете сделать что-то вроде этого:

dct = {}
for author, title in items:
    if author not in dct:
        # Create a new entry for the author
        dct[author] = [title]
    else:
        # Add another item to the existing entry
        dct[author].append(title)

Тело цикла можно сделать более лаконичным:

dct = {}
for author, title in items:
    dct.setdefault(author, []).append(title)
person augurar    schedule 23.01.2015