python - 获取新的唯一列表,仅包含原始列表中最后出现的元素

标签 python list dictionary replace set

对不起,我真的不知道如何命名我的问题。我正在寻找解决以下问题的“最 pythonic”方法:

AA = [["a", 1], ["b", 1], ["c", 1], ["a", 3], ["b", 5], ["a", 7]]
BB = []
for elem in AA:
    if elem[0] not in [elemb[0] for elemb in BB]:
        BB.append(elem)
    else:
        BB[
            [belem[0] for belem in BB].index(elem[0])
        ] = elem
for elem in BB:
    print(elem)

即:我有一个列表列表,每个列表包含两个元素,现在我想将其变成一个新列表,原始列表的列表元素的每个第一个值只出现一次。

上面的代码解决了这个任务,也就是转

[["a", 1], ["b", 1], ["c", 1], ["a", 3], ["b", 5], ["a", 7]]

进入

[["a", 7], ["b", 5], ["c", 1]]

如我所愿,但不是很优雅,我怀疑这是否是最好的解决方案。

我通过使用字典想到了一个想法。简短的版本是:

CC = {elem[0] : elem[1] for elem in AA}
BB = [[elem, CC[elem]] for elem in CC]
BB.sort()
for elem in BB:
    print(elem)

还有更长的一个(出于几个原因我需要它):

CC = {}
for elem in AA:
    try:
        oldelem = CC[elem[0]]
        CC[elem[0]] = elem[1]
        print("Element '{:}' replaced: {:d} -> {:d}".format(
            elem[0], oldelem, elem[1]
        ))
    except KeyError:
        CC[elem[0]] = elem[1]
BB = [[elem, CC[elem]] for elem in CC]
BB.sort()
for elem in BB:
    print(elem)

dict 的问题是,如果列表元素变得更复杂,它会变得有限制,并且对替换会有一些额外的限制(即某些值大于/小于要替换的元素的值等) .)

所以现在我的问题是:是否有更短/“更好”/更简洁的方法来完成这项任务?

最佳答案

您可以使用 OrderedDict 来保留每对的最后一次出现:

>>> from collections import OrderedDict
>>> d=OrderedDict({i:j for i,j in AA})

>>> d.items()
[('a', 7), ('c', 1), ('b', 5)]

关于python - 获取新的唯一列表,仅包含原始列表中最后出现的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33958158/

相关文章:

python - 语法错误 : Non-ASCII character '\xa3' in file when function returns '£'

python - Flask 如何通过 appbuilder 将字段设置为只读

python - 生成列表的随机排列

python - 获取 Dataframe 中每个重复值序列的第一个值

c++ - 将新节点添加到列表并动态命名它

C# 静态字典在抽象类 .NET 2.0 中声明和初始化

Java List of List of List,更好的解决方案?

C++ STL 列表迭代器

python - 反转大型 JSON 字典

Python 2.6.5 defaultdict 覆盖 __setitem__ 无限递归