【问题标题】:Preserving the order in difference between two lists保持两个列表之间的顺序不同
【发布时间】:2015-11-29 19:13:19
【问题描述】:

我有两个列表 ll_matchl_match 是一个空列表。

l = ['gtttaattgagttgtcatatgttaataacg',
     'tttaattgagttgtcatatgttaataacgg',
     'ttaattgagttgtcatatgttaataacggt',
     'taattgagttgtcatatgttaataacggta',
     'aattgagttgtcatatgttaataacggtat']

l_match = []

print list(set(l) - set(l_match))

给出输出

['aattgagttgtcatatgttaataacggtat',
 'tttaattgagttgtcatatgttaataacgg',
 'ttaattgagttgtcatatgttaataacggt',
 'taattgagttgtcatatgttaataacggta',
 'gtttaattgagttgtcatatgttaataacg']

我希望输出的顺序与输入的顺序相同。即在上述情况下,输出 应该是

['gtttaattgagttgtcatatgttaataacg',
 'tttaattgagttgtcatatgttaataacgg',
 'ttaattgagttgtcatatgttaataacggt',
 'taattgagttgtcatatgttaataacggta',
 'aattgagttgtcatatgttaataacggtat']

您能提出修改建议吗?

【问题讨论】:

  • python中的集合不保证顺序
  • set([])set() 相同,任何减去空集的东西就是它自己。你想做什么?
  • 那么,您想要l 中所有不在l_match 中的元素吗?

标签: python list set set-difference


【解决方案1】:

这个呢:How do you remove duplicates from a list in whilst preserving order?

l = ['gtttaattgagttgtcatatgttaataacg', 'tttaattgagttgtcatatgttaataacgg', 'ttaattgagttgtcatatgttaataacggt', 'taattgagttgtcatatgttaataacggta', 'aattgagttgtcatatgttaataacggtat']
seen = set()
seen_add = seen.add
print([ x for x in l if not (x in seen or seen_add(x))])

【讨论】:

    【解决方案2】:

    只需将l_match 设置为一组:

    l_match = []
    
    st =  set(l_match)
    
    print([ele for ele in l if ele not in st])
    

    如果 l 可以让骗子使用 OrderedDict 从 l 获取唯一值:

    from collections import OrderedDict
    print([ele for ele in OrderedDict.fromkeys(l) if ele not in st])
    

    显然l_match 将包含现实世界中的值,或者一个简单的l[:] = OrderedDict.fromkeys(l) 足以从l 中删除欺骗并保持顺序

    【讨论】:

    • 但是...但是...根据定义,l_match 中没有任何内容。有什么意义?
    • @Two-BitAlchemist,我认为 OP 实际上意味着使用带有值的列表,我认为顺序是问题的关键,否则从 l 中删除欺骗是零意义的。跨度>
    • l_match 设为一组有什么好处?这里和ele not in l_match有什么不同?
    • @RobinJamesKerrison,在列表实际具有值的实际用例中,它是二次和线性之间的差异
    • @PadraicCunningham 我也希望如此;我只是不明白为什么在示例代码中它是空的。
    【解决方案3】:

    您应该查看l 并将其中的每个元素包含在结果数组中,前提是它不在l_match 中。这将保留订单。在python中,语句是一行:

    print [entry for entry in l if entry not in l_match]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多