Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据其他列表中的元素对元组列表进行排序_Python_List_Tuples - Fatal编程技术网

Python 根据其他列表中的元素对元组列表进行排序

Python 根据其他列表中的元素对元组列表进行排序,python,list,tuples,Python,List,Tuples,我有如下所示的两个列表。我希望根据列表50中元素的顺序对列表100进行排序 我想把名单翻到100 有什么方法可以使之成为可能吗?您可以将list100转换为dict,并简单地列出list50中的项目及其在dict中的值: d = dict(list100) [(k, d[k]) for k in list50] 这将返回: [('cat', 100), ('bat', 67), ('cat', 100), ('cat', 100), ('bat', 67), ('No Data', 40),

我有如下所示的两个列表。我希望根据列表50中元素的顺序对列表100进行排序

我想把名单翻到100

有什么方法可以使之成为可能吗?

您可以将list100转换为dict,并简单地列出list50中的项目及其在dict中的值:

d = dict(list100)
[(k, d[k]) for k in list50]
这将返回:

[('cat', 100), ('bat', 67), ('cat', 100), ('cat', 100), ('bat', 67), ('No Data', 40), ('bat', 67), ('No Data', 40)]

如果要使用键排序的函数,可以将列表list50转换为列表字典,其中每个列表都包含list50中相应元素的索引。每次调用键函数时,都会从列表中删除最后一个元素

list50 = ['cat', 'bat', 'cat', 'cat', 'bat', 'No Data', 'bat', 'No Data']
list100 = [('cat', 100), ('cat', 100), ('cat', 100), ('bat', 67), ('bat', 67), ('bat', 67), ('No Data', 40), ('No Data', 40)]

lookup = {}
for num, el in enumerate(list50):
    lookup.setdefault(el, []).append(num)       
# print(lookup)
# {'cat': [0, 2, 3], 'bat': [1, 4, 6], 'No Data': [5, 7]}     

list100_ = sorted(list100, key=lambda x: lookup[x[0]].pop())   
# [('cat', 100), ('bat', 67), ('cat', 100), ('cat', 100), ('bat', 67), ('No Data', 40), ('bat', 67), ('No Data', 40)]
如果要保持元组的顺序,使第一个元素与原始列表中的相同,请使用deque和方法popleft从列表中弹出第一个元素:

list50 = ['cat', 'bat', 'cat', 'cat', 'bat', 'No Data', 'bat', 'No Data']
list100 = [('cat', 1), ('cat', 2), ('cat', 3), ('bat', 1), ('bat', 2), ('bat', 3), ('No Data', 1), ('No Data', 2)]

from collections import deque

lookup = {}
for num, el in enumerate(list50):
    lookup.setdefault(el, deque()).append(num)
# print(lookup)
# {'cat': deque([0, 2, 3]), 'bat': deque([1, 4, 6]), 'No Data': deque([5, 7])}     

list100_ = sorted(list100, key=lambda x: lookup[x[0]].popleft())
#[('cat', 1), ('bat', 1), ('cat', 2), ('cat', 3), ('bat', 2), ('No Data', 1), ('bat', 3), ('No Data', 2)]

具有相同第一个元素的两个元组是否保证也具有第二个元素?为什么在不需要排序的情况下进行排序以更有效地生成所需的结果?。。。基于中元素的顺序list50@FilipMłynarski但你不是OP。OP只是想要期望的结果,还是他/她真的需要将排序作为作业要求?列表50中k的[k,d[k]行应该是列表100=[k,d[k]表示列表50中的k]这个答案只有在“cat”,100,“bat”时才正确,67是常数。如果您将'bat',67'bat',67更改为'bat',6'bat',67,代码将出错
list50 = ['cat', 'bat', 'cat', 'cat', 'bat', 'No Data', 'bat', 'No Data']
list100 = [('cat', 100), ('cat', 100), ('cat', 100), ('bat', 67), ('bat', 67), ('bat', 67), ('No Data', 40), ('No Data', 40)]

lookup = {}
for num, el in enumerate(list50):
    lookup.setdefault(el, []).append(num)       
# print(lookup)
# {'cat': [0, 2, 3], 'bat': [1, 4, 6], 'No Data': [5, 7]}     

list100_ = sorted(list100, key=lambda x: lookup[x[0]].pop())   
# [('cat', 100), ('bat', 67), ('cat', 100), ('cat', 100), ('bat', 67), ('No Data', 40), ('bat', 67), ('No Data', 40)]
list50 = ['cat', 'bat', 'cat', 'cat', 'bat', 'No Data', 'bat', 'No Data']
list100 = [('cat', 1), ('cat', 2), ('cat', 3), ('bat', 1), ('bat', 2), ('bat', 3), ('No Data', 1), ('No Data', 2)]

from collections import deque

lookup = {}
for num, el in enumerate(list50):
    lookup.setdefault(el, deque()).append(num)
# print(lookup)
# {'cat': deque([0, 2, 3]), 'bat': deque([1, 4, 6]), 'No Data': deque([5, 7])}     

list100_ = sorted(list100, key=lambda x: lookup[x[0]].popleft())
#[('cat', 1), ('bat', 1), ('cat', 2), ('cat', 3), ('bat', 2), ('No Data', 1), ('bat', 3), ('No Data', 2)]