2013-10-04 4 views
1

у меня есть список, содержащий списки, такие как:В Python, как выбрать строки, содержащие повторяющиеся элементы в списке

rowdata = [['100004100', 'ABC1234AS', '45.96'], 
      ['100004101', 'ABC1234AS', '104.95'], 
      ['100004103', '453SDFAS', '24.52']] 

Я пытаюсь выяснить, как вернуть первое значение и третье значение, как если второе значение соответствует.

Первое значение - номер заказа, второе значение - номер партии, а третий - сумма в долларах. Мой процессор кредитных карт объединяет случайные заказы вместе. Я пытаюсь найти строки, в которых совпадает номер партии, и возвращать номера заказов и суммы для этих строк.

Я думаю, что-то подобное,

for item in rowdata: 
    if item[1] is a duplicate: 
     print item[0], item[1] 
+0

И вопрос в том, что? – khellang

ответ

1
rowdata = [['100004100', 'ABC1234AS', '45.96'], 
      ['100004101', 'ABC1234AS', '104.95'], 
      ['100004103', '453SDFAS', '24.52']] 

def find_duplicates(duplicate): 
    return [(item[0], item[2]) for item in rowdata if item[1] == duplicate] 

print find_duplicates('ABC1234AS') 

Печать:

[('100004100', '45.96'), ('100004101', '104.95')] 
0

Если вы пытаетесь сгруппировать заказы по номеру партии вы могли бы использовать defaultdict.

rowdata = [['100004100', 'ABC1234AS', '45.96'], 
      ['100004101', 'ABC1234AS', '104.95'], 
      ['100004103', '453SDFAS', '24.52']] 

batches = defaultdict(list) 

for order in rowdata: 
    batches[order[1]].append([order[0], order[2]]) 

for batch, orders in batches.iteritems(): 
    print "%s: %s" % (batch, orders) 

Выходы:

ABC1234AS: [['100004100', '45.96'], ['100004101', '104.95']] 
453SDFAS: [['100004103', '24.52']] 
3

Python имеет некоторые довольно полезные встроенные инструменты, но иногда они могут быть трудно найти, если вы не знаете, что искать. Здесь полезны groupby и itemgetter.

from itertools import groupby 
from operator import itemgetter 

rowdata = [['100004100', 'ABC1234AS', '45.96'], 
      ['100004101', 'ABC1234AS', '104.95'], 
      ['100004103', '453SDFAS', '24.52']] 

for key, group in groupby(rowdata, itemgetter(1)): 
    print key, list(group) 

дает вам:

ABC1234AS [[ '100004100', 'ABC1234AS', '45 .96 '], [' 100004101' , 'ABC1234AS', '104.95']]

453SDFAS [['100004103', '453SDFAS', '24 .52 ']]

0

Что-то вроде следующего?

rowdata = [['100004100', 'ABC1234AS', '45.96'], ['100004101', 'ABC1234AS', '104.95'], ['100004103','453SDFAS', '24.52']] 

bucket = defaultdict(list) 
for col1, col2, col3 in rowdata: 
    bucket[col2].append((col1,col3)) 

duplicates = {key:value for key, value in bucket.items() if len(value) > 1} 

print (duplicates) 

Печать следующее:

{ 'ABC1234AS': [('100004100', '45 .96 '), (' 100004101' , '104.95')]}

Рабочий пример: http://ideone.com/RBJjh5

Смежные вопросы