从unicode字符串列表中删除重复项

时间:2013-08-18 04:57:27

标签: python list unicode-string

我正在尝试从unicode字符串列表中删除重复项而不更改其中出现的元素的顺序(因此,我不想使用set)。

程序:

result = [u'http://google.com', u'http://www.catb.org/esr/faqs/hacker-howto.html', u'http://www.catb.org/~esr/faqs/hacker-howto.html',u'http://amazon.com', u'http://www.catb.org/esr/faqs/hacker-howto.html', u'http://yahoo.com']
result.reverse()
for e in result:
    count_e = result.count(e)
    if count_e > 1:
        for i in range(0, count_e - 1):
            result.remove(e)
result.reverse()
print result

输出:

[u'http://google.com', u'http://www.catb.org/esr/faqs/hacker-howto.html', u'http://www.catb.org/~esr/faqs/hacker-howto.html', u'http://amazon.com', u'http://yahoo.com']

预期输出:

[u'http://google.com', u'http://catb.org/~esr/faqs/hacker-howto.html', u'http://amazon.com', u'http://yahoo.com']

那么,有没有办法尽可能简单。

4 个答案:

答案 0 :(得分:3)

您的列表中实际上没有重复项。有一次你有http://catb.org,而另一次有http://www.catb.org

您必须找到一种方法来确定网址是否在前面www.

答案 1 :(得分:2)

您可以使用一个集合,然后按原始索引对其进行排序:

sorted(set(result), key=result.index)

这是有效的,因为index会返回第一个匹配项(因此它会根据原始列表中的第一个外观保持顺序)

我还注意到你原来的一个字符串不是unicode字符串。所以你可能想做类似的事情:

u = [unicode(s) for s in result]
return sorted(set(u), key=u.index)

编辑:'http://google.com''http://www.google.com'不是字符串重复项。如果你想这样对待它们,你可以做类似的事情:

def remove_www(s):
    s = unicode(s)
    prefix = u'http://'
    suffix = s[11:] if s.startswith(u'http://www') else s[7:]
    return prefix+suffix

然后用

替换早期的代码
u = [remove_www(s) for s in result]
return sorted(set(u), key=u.index)

答案 2 :(得分:2)

您可以创建一个新列表并向其中添加项目(如果它们尚未包含在其中)。

result = [ /some list items/]
uniq = []
for item in result:
    if item not in uniq:
        uniq.append(item)

答案 3 :(得分:0)

以下是一种修改result的方法:

result = [u'http://google.com', u'http://catb.org/~esr/faqs/hacker-howto.html', u'http://www.catb.org/~esr/faqs/hacker-howto.html',u'http://amazon.com', 'http://www.catb.org/esr/faqs/hacker-howto.html', u'http://yahoo.com']
seen = set()
i = 0
while i < len(result):
    if result[i] not in seen:
        seen.add(result[i])
        i += 1
    else:
        del result[i]