使用第一次出现的索引Python替换列表中所有出现的元素

时间:2017-09-25 22:36:46

标签: python list

说我在这里有这个可爱的名单:

my_list = ["Andy", "Ben", "Andy", "Ben", "Carol", "Ben"] 

我想用它出现的顺序替换每个元素(所以“Andy” - > 1,“Ben” - > 2,“Carol” - > 3)。我想要回来的清单是:

ordered_list = [1, 2, 1, 2, 3, 2] 

这可以通过整数变量作为计数器和字典来完成,其中我存储列表中每个元素出现的顺序。然而,这感觉粗糙而不是Pythonic。

使用列表理解为我完成任务的光滑单行程是什么?有没有一个或我的情况太小众?

1 个答案:

答案 0 :(得分:4)

“光滑的单行”通常不是你应该去的东西。强制解决方案成为单行程序通常会产生类似于code-golfing的过程,其中可读性确实受到影响。相反,您应该尝试生成可读代码。在Python中,这通常会导致单行,但它肯定不是要求也不是保证。

在这种情况下,我们几乎可以使用单线。我在这里使用的解决方案使用dict.setdefault来同时检索和设置字典值。这样,当我们遍历原始列表时,我们可以从中获取先前存储的索引或使用新索引更新字典:

my_list = ["Andy", "Ben", "Andy", "Ben", "Carol", "Ben"]

indexes = {}
order_list = [indexes.setdefault(x, len(indexes) + 1) for x in my_list]

print(order_list) # [1, 2, 1, 2, 3, 2]