Это похоже на проблему сортировки, группировки, сравнения. Не совсем уверен, почему, но я выбрал класс, который имеет методы, необходимые для сортировки, группировки и сравнения. ... Python 2.7 код:
Setup;
import io, collections, operator, csv
s = '''name,time,data
tg,0x34,1111
ab,0x54,1011
k,0x34,0100
c,0x34,0001
e,0x34,0000
d,0x34,1111'''
# for file emulation
f = io.BytesIO(s)
Класс для провести инфо и работа с инструментами Python
class Thing(object):
def __init__(self, name = None, time = None, data = None):
self. name = name
self.time = time
self.data = data
def __eq__(self, other):
'For comparison'
equal = self.time == other.time
# equal if there is a one in both things at the same bit position
equal = equal and bool(int(self.data, base = 2) &
int(other.data, base = 2))
return equal
def __lt__(self, other):
'For sorting'
return self.time < other.time
def __str__(self):
return '({}, {}, {})'.format(self.name, self.time, self.data)
def __repr__(self):
return '({}, {}, {})'.format(self.name, self.time, self.data)
Используйте модуль CSV, чтобы сделать список Thing
-х и сортирует их (time
):
reader = csv.DictReader(f)
things = [Thing(**row) for row in reader]
things.sort()
Используйте itertools.groupby и itertools.combination, чтобы сравнить вещи с одинаковыми time
, Поместите вещи, которые равны в наборе.
results = set()
for key, group in itertools.groupby(things, key = operator.attrgetter('time')):
print key
for a, b in itertools.combinations(group, 2):
if a == b:
print '\t{} is duplicate of {}'.format(a, b)
results.add(a)
results.add(b)
Это приводит к
>>>
0x34
(tg, 0x34, 1111) is duplicate of (k, 0x34, 0100)
(tg, 0x34, 1111) is duplicate of (c, 0x34, 0001)
(tg, 0x34, 1111) is duplicate of (d, 0x34, 1111)
(k, 0x34, 0100) is duplicate of (d, 0x34, 1111)
(c, 0x34, 0001) is duplicate of (d, 0x34, 1111)
0x54
>>> results
set([(tg, 0x34, 1111), (c, 0x34, 0001), (d, 0x34, 1111), (k, 0x34, 0100)])
>>>
Не уверен, что, если я понял спецификации - Нижеперечисленные набора данных производит ноль дубликатов:
s = '''name,time,data
tg,0x34,0010
ab,0x54,1011
k,0x34,0100
c,0x34,0001
e,0x34,0000
d,0x34,1000'''
You вероятно, хотят, чтобы дубликаты были раздельными, поэтому держите их в словаре, используя время в качестве ключа.
results = collections.defaultdict(set)
for key, group in itertools.groupby(things, key = operator.attrgetter('time')):
print key
for a, b in itertools.combinations(group, 2):
if a == b:
print '\t{} is duplicate of {}'.format(a, b)
results[key].update((a,b))
Как выведенный результат является допустимым? –
Я в замешательстве. Итак, мы удаляем любые строки, которые не имеют дубликата в столбце 'time'? Вообще, для такого рода манипуляций с данными, я бы предложил посмотреть на «панды». – spicypumpkin
Вам нужны все строки, где только второй столбец одинаковый? – wwii