使用一个列表来排序另一个

使用一个列表来排序另一个

问题描述:

我想用Python 3来使用list_one对list_two进行排序并输出到list_sorted。如果字段的值丢失,那么我希望看到一个空值。输出将具有相同数量的项目作为list_one使用一个列表来排序另一个

list_one = ['one', 'two', 'three', 'four', 'five', 'six', 'seven'] 
list_two = ['seven', 'five', 'four', 'three', 'one'] 
list_sorted = [] 

for i in list_one: 
    for field in list_two: 
     if i == field: 
      list_sorted.append(field) 
     else: 
      list_sorted.append(None) 

print ('final output:', list_sorted) 

所需的输出是:

['one', None, 'three', 'four', 'five', None, 'seven'] 

但它的实际输出:

[None, None, None, None, 'one', None, None, None, None, None, None, None, None, 'three', None, None, None, 'four', None, None, None, 'five', None, None, None, None, None, None, None, None, 'seven', None, None, None, None] 

我现在的想法是答案涉及enumerate但我不确定。任何帮助将大大赞赏。

+0

看起来并不像你正在排序的东西。 –

list_two转换成一个集合,然后根据该元素是否在list_two建立一个列表理解。

set_two = set(list_two) 
list_sorted = [x if x in set_two else None for x in list_one] 

print(list_sorted) 
['one', None, 'three', 'four', 'five', None, 'seven'] 
+0

太棒了!谢谢@coldspeed。我有一些阅读要做。我不知道这是否适合StackOverflow,但我还有两个问题:是他们称之为“三元”还是速记?如果是这样,什么是长期版本?我不明白那里发生了什么。第二个问题是,如果list_two是二维的呢? – Jarvis

+0

@Jarvis不,这被称为“列表理解”。三元或简写是一个不同的概念,涉及在单行中级联if-else语句(您在此看不到)。至于你的第二个问题,解决方案是相似的,你只需要将维度扩展为1.如果你想知道如何做到这一点,请提出一个新问题。此外,您可以标记接受的最有帮助的答案,所以请考虑这样做。谢谢。 –

你不是真的排序任何东西,但它看起来像你可以达到你想要一部测试i是否存在于list_two。删除内部for循环。

list_one = ['one', 'two', 'three', 'four', 'five', 'six', 'seven'] 
list_two = ['seven', 'five', 'four', 'three', 'one'] 
list_sorted = [] 

for i in list_one: 
    if i in list_two: 
     list_sorted.append(i) 
    else: 
     list_sorted.append(None) 

print ('final output:', list_sorted) 
+0

更好地转换为一组快速查找! https://stackoverflow.com/a/46801255/4909087 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ看起来很短,这绝对看起来不错,但它真的更快?我在'list_one'中看到一个'for x',如果x在set_two else None中看到'x,这看起来与我所得到的非常相似。但是我没有写太多的Python - 是最Pythonista的方式吗? –

+1

重要的位是'x if x in set_two else None',这有利于查找,因为集合可以支持O(1)中的查找,而列表(例如list_two)则不能。小列表中看不出这种差异,但这种方法在复杂度上是二次的。仍然,很好的努力,所以你有我的投票:) –