2017-09-25 39 views
0

说我有这个可爱的名单在这里:替换元素的所有出现在其第一次出现的索引列表,巨蟒

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

我想取代它出现在(这样的顺序每一个元素“Andy” - > 1,“Ben” - > 2,“Carol” - > 3)。名单我想回去是这样的:

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

这可以用一个整数变量作为计数器和一本字典,我存储在其中出现在我的列表中的每个元素的顺序进行。然而,这感觉粗糙而不是Pythonic。

什么将是一个圆滑的单线程,使用列表理解来完成我的任务对我?有没有一个或我的情况太小?

+0

请花时间阅读[问]。 – wwii

回答

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] 
+0

辉煌,谢谢!我试图理解列表理解,因此我尽可能地利用它来尽可能地使用它。话虽如此,我一定会留意确保我的代码保持可读性和简单性。 –

相关问题