0

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

程序:

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

4 回答 4

3

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

您必须想办法确定 URL 是否www.在前面。

于 2013-08-18T05:04:33.347 回答
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)
于 2013-08-18T05:01:26.727 回答
2

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

result = [ /some list items/]
uniq = []
for item in result:
    if item not in uniq:
        uniq.append(item)
于 2013-08-18T05:01:54.900 回答
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]
于 2013-08-18T05:03:25.810 回答