删除重复的条目?

时间:2013-07-09 14:58:08

标签: python

我需要比较不同行的值。每行都是一个字典,我需要比较关键'flag'的相邻行中的值。我该怎么做?简单地说:

for row in range(1,len(myjson))::
      if row['flag'] == (row-1)['flag']:
             print yes

返回TypeError:'int' object is not subscriptable

即使范围返回一个整体列表......


对评论的回应:

行列表是字典列表。最初,我导入一个制表符分隔的文件,并使用csv.dict模块读取它,这样它就是一个字典列表,其中的键对应于变量名。

代码:(其中myjson是字典列表)

for row in myjson:
    print row

输出:

{'website': '', 'phone': '', 'flag': 0, 'name': 'Diane Grant Albrecht M.S.', 'email': ''}
{'website': 'www.got.com', 'phone': '111-222-3333', 'flag': 1, 'name': 'Lannister G. Cersei M.A.T., CEP', 'email': 'cersei@got.com'}
{'website': '', 'phone': '', 'flag': 2, 'name': 'Argle D. Bargle Ed.M.', 'email': ''}
{'website': 'www.daManWithThePlan.com', 'phone': '000-000-1111', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': 'dman123@gmail.com'}
{'website': '', 'phone': '', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': ''}
{'website': 'www.daManWithThePlan.com', 'phone': '111-222-333', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': 'dman123@gmail.com'}
{'website': '', 'phone': '', 'flag': 4, 'name': 'D G Bamf M.S.', 'email': ''}
{'website': '', 'phone': '', 'flag': 5, 'name': 'Amy Tramy Lamy Ph.D.', 'email': ''}

此外:

type(myjson)

<type 'list'>

6 个答案:

答案 0 :(得分:2)

为了比较相邻的项目,您可以使用zip

示例:

>>> lis = [1,1,2,3,4,4,5,6,7,7]
for x,y in zip(lis, lis[1:]):
     if x == y :
        print x,y,'are equal'
...         
1 1 are equal
4 4 are equal
7 7 are equal

对于您的词典列表,您可以执行以下操作:

from itertools import izip
it1 = iter(list_of_dicts)
it2 = iter(list_of_dicts)
next(it2)
for x,y in izip(it1, it2):
      if x['flag'] == y['flag']
             print yes

更新:

对于超过2个相邻的项目,您可以使用itertools.groupby

>>> lis =  [1,1,1,1,1,2,2,3,4]
for k,group in groupby(lis):
     print list(group)

[1, 1, 1, 1, 1]
[2, 2]
[3]
[4]

对于您的代码,它将是:

>>> for k, group in groupby(dic, key = lambda x : x['flag']):
...     print list(group)
...     
[{'website': '', 'phone': '', 'flag': 0, 'name': 'Diane Grant Albrecht M.S.', 'email': ''}]
[{'website': 'www.got.com', 'phone': '111-222-3333', 'flag': 1, 'name': 'Lannister G. Cersei M.A.T., CEP', 'email': 'cersei@got.com'}]
[{'website': '', 'phone': '', 'flag': 2, 'name': 'Argle D. Bargle Ed.M.', 'email': ''}]
[{'website': 'www.daManWithThePlan.com', 'phone': '000-000-1111', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': 'dman123@gmail.com'}, {'website': '', 'phone': '', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': ''}, {'website': 'www.daManWithThePlan.com', 'phone': '111-222-333', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': 'dman123@gmail.com'}]
[{'website': '', 'phone': '', 'flag': 4, 'name': 'D G Bamf M.S.', 'email': ''}]
[{'website': '', 'phone': '', 'flag': 5, 'name': 'Amy Tramy Lamy Ph.D.', 'email': ''}]

答案 1 :(得分:1)

您的例外表明list_of_rows不是您认为的那样。

要查看其他相邻的行,如果list_of_rows确实是一个列表,我会使用enumerate()包含当前索引,然后使用该索引加载下一行和上一行:

for i, row in enumerate(list_of_rows):
    previous = list_of_rows[i - 1] if i else None
    next = list_of_rows[i + 1] if i + 1 < len(list_of_rows) else None

答案 2 :(得分:1)

您希望批量访问列表元素:
http://code.activestate.com/recipes/303279/

答案 3 :(得分:1)

你可以试试这个

pre_item = list_of_rows[0]['flag']
for row in list_of_rows[1:]:
      if row['flag'] == pre_item :
             print yes
      pre_item = row['flag']

答案 4 :(得分:0)

list_of_rows = [ { 'a': 'foo',
                   'flag': 'bar' },
                 { 'a': 'blo',
                   'flag': 'bar' } ]
for row, successor_row in zip(list_of_rows, list_of_rows[1:]):
    if row['flag'] == successor_row['flag']:
        print "yes"

答案 5 :(得分:0)

这很简单。如果您需要删除那些与键“flag”具有相同值的dicts,正如您帖子的标题所暗示的那样(这有点误导,因为您的词典严格来说并不重复),您可以简单地遍历整个词典列表,在一个单独的列表中跟踪标志,如果一个项目已经在标志列表中的标志只是不添加它,它将看起来像:

def filterDicts(listOfDicts):
    result = []
    flags = []
    for di in listOfDicts:
        if di["flag"] not in flags:
            result.append(di)
            flags.append(di["flag"])
    return result

当使用您提供的词典列表的值调用时,它会返回包含5个项目的列表,每个项目都有一个唯一的标记值。