如何在Python中从列表中删除不可损坏的重复项?

2024-09-29 01:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据是:

[{u'webpath': u'/etc/html', u'server_port': u'80'}, {u'webpath': [u'/www/web'], u'server_port': u'80'}, {u'webpath': [u'/www/web'], u'server_port': u'80'}, {u'webpath': [u'/www/shanghu'], u'server_port': u'80'}, {u'webpath': [u'/www/shanghu'], u'server_port': u'80'}, {u'webpath': [u'/www/www/html/falv'], u'server_port': u'80'}, {u'webpath': [u'/www/www/html/falv'], u'server_port': u'80'}, {u'webpath': [u'/www/www/html/falv'], u'server_port': u'80'}, {u'webpath': [u'/www/falvhezi'], u'server_port': u'80'}, {u'webpath': [u'/www/test10'], u'server_port': u'80'}, {u'webpath': u'/etc/html', u'server_port': u'80'}, {u'webpath': u'/etc/html', u'server_port': u'80'}, {u'webpath': u'/etc/html', u'server_port': u'80'}, {u'webpath': u'/etc/html', u'server_port': u'80'}, {u'webpath': u'/etc/html', u'server_port': u'80'}, {u'webpath': u'/etc/html', u'server_port': u'80'}, {u'webpath': [u'/www/400.ask.com'], u'server_port': u'80'}, {u'webpath': [u'/www/www'], u'server_port': u'80'}, {u'webpath': [u'/www/www'], u'server_port': u'80'}, {u'webpath': [u'/www/www'], u'server_port': u'80'}, {u'webpath': [u'/www/zhuanti'], u'server_port': u'80'}, {u'webpath': [u'/www/zhuanti'], u'server_port': u'80'}, {u'webpath': [u'/www/shanghu'], u'server_port': u'80'}]

我的代码是:

^{pr2}$

但脚本返回:

TypeError: "unhashable type: 'list'"

Tags: 数据comwebserverporthtmlwwwetc
2条回答

最直接的方法是直接使用正在构建的新列表测试成员资格。在

new_webpath_list = []
for webpath in nginxConfs:
    if webpath not in new_webpath_list:
        new_webpath_list.append(webpath)

这将处理不可损坏类型的任意(预先未知)嵌套级别的情况。它还使您的代码更简单、更易于理解,而且可能更高效,因为您不需要创建您不需要的额外数据(没有seen集,没有元素到元组的转换)。在

您正在从字典中创建元组以使其可散列,但在这些元组中仍然可以存在不可散列的列表!相反,您还必须“tuplefy”这些值。在

t = tuple(((k, tuple(v)) for (k, v) in webpath.items()))

注意,这有点小故障,因为dict中的第一个条目只是一个字符串,而其他条目是字符串列表。您可以使用if/else来修复此问题,但实际上不需要这样做。在

^{pr2}$

或者,你也可以记住字典的字符串表示。。。在

t = repr(webpath)

相关问题 更多 >