使用一个列表来排序另一个
我想用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但我不确定。任何帮助将大大赞赏。
将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']
太棒了!谢谢@coldspeed。我有一些阅读要做。我不知道这是否适合StackOverflow,但我还有两个问题:是他们称之为“三元”还是速记?如果是这样,什么是长期版本?我不明白那里发生了什么。第二个问题是,如果list_two是二维的呢? – Jarvis
@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)
更好地转换为一组快速查找! https://stackoverflow.com/a/46801255/4909087 –
@cᴏʟᴅsᴘᴇᴇᴅ看起来很短,这绝对看起来不错,但它真的更快?我在'list_one'中看到一个'for x',如果x在set_two else None中看到'x,这看起来与我所得到的非常相似。但是我没有写太多的Python - 是最Pythonista的方式吗? –
重要的位是'x if x in set_two else None',这有利于查找,因为集合可以支持O(1)中的查找,而列表(例如list_two)则不能。小列表中看不出这种差异,但这种方法在复杂度上是二次的。仍然,很好的努力,所以你有我的投票:) –
看起来并不像你正在排序的东西。 –