2015-01-23 2 views
0

Я хотел бы удалить дубликаты из столбца 1 и вернуть в colum 2 связанный список значений, связанных с каждым уникальным элементом, используя python.найти дубликаты в столбце, вернуть уникальный элемент и перечислить его соответствующие значения из другого столбца в 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' 

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

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

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

set(['Jack London']) 
+0

Как вы делящихся столбцов? –

+0

@AdamSmith Я не думаю, что это имеет значение, он не спрашивает, как разбирать входные данные. – augurar

+0

Заманчиво просто написать код, который сделает это за вас, но я не думаю, что вы или я многому научимся этим. Вот пример, который, на мой взгляд, был бы полезен: https://docs.python.org/2/library/collections.html#defaultdict-examples – spirulence

ответ

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'} 
+0

Я думаю, что следующие результаты ближе к нужному заданию: result = {group: [x [1:] [0] для x в значениях] для группы, значения в группировке} –

+0

@JimDennis True. Я должен, вероятно, даже сделать 'data = {group: [col [1] для col in values] для группы, значения в grouped}; result = "{} {}". format (строка [0], '' .join (строка [1:]) для строки в данных) ' –

+0

Да, технически он говорит, что« выход должен быть »... но Я предполагаю, что он больше интересуется результирующей структурой данных, а не литералов. Мое предложение и ответ авгурара, который я поддержал, основываются на этой интерпретации его вопроса, а не на буквальном запросе на «вывод». –

2

В 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)