从Python列表中删除重复记录

时间:2015-03-31 22:16:26

标签: python list duplicates iteration

我从URL获取数据并对该数据进行一些处理。我现在已经到了需要消除重复的地步。以下是我的程序的输出。

{u'Price': 133.84, u'@Number': u'1', u'Mw': 10} 
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} 
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} 
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} 
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9} 
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10} 
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} 
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} 
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} 
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9} 
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10} 
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} 
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} 
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} 
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9}

我希望这是我的输出:

{u'Price': 133.84, u'@Number': u'1', u'Mw': 10} 
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} 
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} 
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} 
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9}

@Number可以在1-7之间。解决这个问题的最佳方法是什么?我是否需要获得@Number的最大值,然后打印尽可能多的行作为我的最大值?

6 个答案:

答案 0 :(得分:3)

您可以为已经看过的人保留一套:

seen=set()
data=[]
for e in input:
    if e["@Number"] not in seen:
        seen.add(e["@Number"])
        data.append(e)

>>> data
[{u'Price': 133.84, u'@Number': u'1', u'Mw': 10}, {u'Price': 139.09, u'@Number': u'2', u'Mw': 15}, {u'Price': 144.34, u'@Number': u'3', u'Mw': 10}, {u'Price': 148.53, u'@Number': u'4', u'Mw': 10}, {u'Price': 152.52, u'@Number': u'5', u'Mw': 9}]

如果您的数据按顺序排列,并且在打印最大值后您的行将完成,您可以这样做:

>>> input[0:max(int(e) for e in (d['@Number'] for d in input))]
[{u'Price': 133.84, u'@Number': u'1', u'Mw': 10}, {u'Price': 139.09, u'@Number': u'2', u'Mw': 15}, {u'Price': 144.34, u'@Number': u'3', u'Mw': 10}, {u'Price': 148.53, u'@Number': u'4', u'Mw': 10}, {u'Price': 152.52, u'@Number': u'5', u'Mw': 9}]

答案 1 :(得分:2)

使用OrderedDict维护订单,u'@Number'仅作为关键字添加,如果u'@Number'尚未输入dict。

l=[{u'Price': 133.84, u'@Number': u'1', u'Mw': 10},
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15},
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10},
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10},
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9},
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10},
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15},
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10},
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10},
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9},
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10},
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15},
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10},
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10},
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9}
]

from collections import OrderedDict
od = OrderedDict()
for d in l:
    num =  d["@Number"]
    if num not in od:
        od[num] = d

print(list(od.values())

[{u'@Number': u'1', u'Mw': 10, u'Price': 133.84},
{u'@Number': u'2', u'Mw': 15, u'Price': 139.09},
{u'@Number': u'3', u'Mw': 10, u'Price': 144.34},
{u'@Number': u'4', u'Mw': 10, u'Price': 148.53},
{u'@Number': u'5', u'Mw': 9, u'Price': 152.52}]

如果您的示例中的订单始终得到保证,那么当您找到重复的"@Number"时,您可以暂停:

for d in l:
    num = d["@Number"]
    if num not in od:
        od[num] = d
    else:
         break

如果您想使用max

from itertools import islice
from operator import itemgetter

# for @Number" > 9 use lambda
#  mx = int(max(l, key=lambda x: int(x["@Number"]))["@Number"])
mx = int(max(l, key=itemgetter("@Number"))["@Number"])
print(list(islice(l,None,mx)))

答案 2 :(得分:1)

这个程序符合你的要求:

data = [
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10} ,
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} ,
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} ,
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} ,
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9} ,
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10} ,
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} ,
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} ,
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} ,
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9} ,
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10} ,
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} ,
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} ,
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} ,
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9},
]

result = []
for item in data:
    if item not in result:
        result.append(item)
for item in result:
    print item

输出:

{u'Price': 133.84, u'@Number': u'1', u'Mw': 10}
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15}
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10}
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10}
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9}

答案 3 :(得分:1)

另一种可能性,使用OrderedDict:

from collections import OrderedDict

l = [{u'Price': 133.84, u'@Number': u'1', u'Mw': 10}, 
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} ,
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} ,
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} ,
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9} ,
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10} ,
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} ,
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} ,
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} ,
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9} ,
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10} ,
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15} ,
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10} ,
{u'Price': 148.53, u'@Number': u'4', u'Mw': 10} ,
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9}]

od = OrderedDict()

for d in l:
    od[d["@Number"]] = d


print(od)

结果是:

OrderedDict([('1', {'@Number': '1', 'Price': 133.84, 'Mw': 10}), ('2', {'@Number': '2', 'Price': 139.09, 'Mw': 15}), ('3', {'@Number': '3', 'Price': 144.34, 'Mw': 10}), ('4', {'@Number': '4', 'Price': 148.53, 'Mw': 10}), ('5', {'@Number': '5', 'Price': 152.52, 'Mw': 9})])

在dict中,@ Number用作键。因为它是一个OrderedDict,所以保留了原始列表中Numbers的顺序。

答案 4 :(得分:0)

您可以使用Price @Number和Mw作为键创建字典。然后检查新项目是否已经在dict中。

def combine(L):
    results = {}
    for item in L:
        key = (item["Price"], item["@Number"],item["Mw"])
        if key not in results:  # combine them
            results[key] = item
    return results.values()

输出

{u'Price': 148.53, u'@Number': u'4', u'Mw': 10}
{u'Price': 139.09, u'@Number': u'2', u'Mw': 15}
{u'Price': 152.52, u'@Number': u'5', u'Mw': 9}
{u'Price': 144.34, u'@Number': u'3', u'Mw': 10}
{u'Price': 133.84, u'@Number': u'1', u'Mw': 10}

答案 5 :(得分:0)

如果您的数据看起来和您描述的一样,并且您想要排除相同的三元组,那么显而易见的解决方案是将它们转换为集合。由于订单很重要,因此您可以使用collections.OrderedDict代替虚拟值True

您首先需要将数据转换为元组,因为字典不能用作dict键:

mytuples = [ tuple(x["Price"], x["@Number"], x["Mw"]) for x in mydata

(或者只是将数据构建为元组开头)。

然后:

from collections import OrderedDict
unique = OrderedDict((tup, True) for tup in mytuples) 

现在,您可以使用unique.keys()按照查看顺序检索三元组。