python - 删除子列表重复项,包括反向

例如我有以下内容

list = [['1', '2'], ['1', '3'], ['1', '4'], ['1', '5'], ['2', '1'], ['4', '1'], ['2', '6']]

如果一个子列表在同一个列表中有一个反向子列表(即 ['1', '2'] = ['2', '1']),我想匹配,如果是 True 则从中删除列出镜像的。

最终列表应如下所示:

list = [['1', '2'], ['1', '3'], ['1', '4'], ['1', '5']['2', '6']]

这是我尝试过的:

for i in range(len(list)):
    if list[i] == list[i][::-1]:
            print("Match found")
            del list[i][::-1]

print(list)

但最后我得到了与原始列表相同的列表。我不确定我的匹配条件是否正确。

最佳答案

您可以遍历列表的元素,并使用 set跟踪到目前为止已经看到的那些。使用集合是检查成员资格的更方便的方法,因为操作 has a lower complexity ,在这种情况下,您需要使用元组,因为列表不可散列。如果没有看到实际的元组或 reversed,则保留这些项目(如果你只想忽略那些有 reversed 的项目,你只需要 if tuple (在 s 中反转(t))):

s = set()
out = []
for i in l:
    t = tuple(i)
    if t in s or tuple(reversed(t)) in s:
        continue
    s.add(t)
    out.append(i)

print(out)
# [['1', '2'], ['1', '3'], ['1', '4'], ['1', '5'], ['2', '6']]

https://stackoverflow.com/questions/61631914/

相关文章:

node.js - Yarn workspaces——包别名

ruby-on-rails - 如何在 Ruby on Rails 6 中将 rich_text_a

svelte - 如何替换 Svelte 中目标的内容而不是附加到子项?

delphi - 如何在 Delphi 10.3 Rio 上安装 Indy?

javascript - AWS Elastic Beanstalk : How to change

c# - 如何使用 Sustainsys.Saml2 设置 NLog

python - 如何聚焦光线或如何在 pygame 中只绘制窗口的某些圆形部分?

c# - 为什么 Visual Studio 不警告我空引用异常?

node.js - 使用 nodeJs 从 AWS SQS 队列中获取待处理的消息数

python - 使用 zip() 对元组列表进行排序时,有时不支持“<”