Python 从另一个列表访问列表值

Python 从另一个列表访问列表值,python,Python,比如说,目前我有一个列表,其中包括: L = [[1,'JAYCE'],[2,'AMIE'],[3,'JACK'],[4,'STEVE'],[5,'JAYCE']] 我还有另一个列表,其中包含按顺序排列的名称: sortedNames = ['AMIE','JACK','JAYCE','JAYCE','STEVE'] 我想得到的输出是,基于排序名称列表,我想按照排序顺序将ID添加回名称,排序顺序是基于sortedNames列表的 finalist = [[2,'AMIE'],[3,'JACK

比如说,目前我有一个列表,其中包括:

L = [[1,'JAYCE'],[2,'AMIE'],[3,'JACK'],[4,'STEVE'],[5,'JAYCE']]
我还有另一个列表,其中包含按顺序排列的名称:

sortedNames = ['AMIE','JACK','JAYCE','JAYCE','STEVE']
我想得到的输出是,基于排序名称列表,我想按照排序顺序将ID添加回名称,排序顺序是基于sortedNames列表的

finalist = [[2,'AMIE'],[3,'JACK'],[1,'JAYCE'],[5,'JAYCE'],[4,'STEVE']]
请注意,房祖名出现了两次,所以即使房祖名的第一次出现是5,然后是1,它也完全没有问题

我一直在想这样的事情:

L = [[1,'JAYCE'],[2,'AMIE'],[3,'JACK'],[4,'STEVE'],[5,'JAYCE']]
sortedNames = ['AMIE','JACK','JAYCE','JAYCE','STEVE']

finalist = []
for i in sortedNames:
    j = 0
    if i in L[j][1]:
        finalist.append(L[0] + i)
    j+=1

print(finalist)
我得到一个错误,说:

TypeError: can only concatenate list (not "str") to list

我肯定是把它加错了

您可以通过将每个名称分组到为该名称找到的所有ID的列表中来创建字典。然后,可以应用
next

import itertools
L = [[1,'JAYCE'],[2,'AMIE'],[3,'JACK'],[4,'STEVE'],[5,'JAYCE']]
new_l = {a:iter([c for c, _ in b]) for a, b in itertools.groupby(sorted(L, key=lambda x:x[-1]), key=lambda x:x[-1])}
sortedNames = ['AMIE','JACK','JAYCE','JAYCE','STEVE']
final_data = [[next(new_l[i]), i] for i in sortedNames]
输出:

[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
编辑:

还可以利用排序后的

L = [[1,'JAYCE'],[2,'AMIE'],[3,'JACK'],[4,'STEVE'],[5,'JAYCE']]
sortedNames = ['AMIE','JACK','JAYCE','JAYCE','STEVE']
new_result = sorted(L, key=lambda x:(sortedNames.index(x[-1]), x[0]))
输出:

[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]

您可以通过将每个名称分组到为该名称找到的所有ID的列表中来创建字典。然后,可以应用
next

import itertools
L = [[1,'JAYCE'],[2,'AMIE'],[3,'JACK'],[4,'STEVE'],[5,'JAYCE']]
new_l = {a:iter([c for c, _ in b]) for a, b in itertools.groupby(sorted(L, key=lambda x:x[-1]), key=lambda x:x[-1])}
sortedNames = ['AMIE','JACK','JAYCE','JAYCE','STEVE']
final_data = [[next(new_l[i]), i] for i in sortedNames]
输出:

[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
编辑:

还可以利用排序后的

L = [[1,'JAYCE'],[2,'AMIE'],[3,'JACK'],[4,'STEVE'],[5,'JAYCE']]
sortedNames = ['AMIE','JACK','JAYCE','JAYCE','STEVE']
new_result = sorted(L, key=lambda x:(sortedNames.index(x[-1]), x[0]))
输出:

[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]

因此,只要您的数据表现良好,您就可以使用defaultdict将您的数字分组为DEQUE:

In [14]: from collections import defaultdict, deque

In [15]: grouper = defaultdict(deque)

In [16]: for a,b in L:
    ...:     grouper[b].append(a)
    ...:
然后简单地说:

In [17]: grouper
Out[17]:
defaultdict(collections.deque,
            {'AMIE': deque([2]),
             'JACK': deque([3]),
             'JAYCE': deque([1, 5]),
             'STEVE': deque([4])})

In [18]: [[grouper[x].popleft(), x] for x in sortedNames]
Out[18]: [[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
我意识到在列表中使用
pop
是一个丑陋的缺点

这里有一种仅使用
dict
list
的方法:

In [19]: grouper = {}
    ...: for a,b in L:
    ...:     grouper.setdefault(b, []).append(a)
    ...:

In [20]: grouper = {k:v[::-1] for k, v in grouper.items()}

In [21]: [[grouper[x].pop(), x] for x in sortedNames]
Out[21]: [[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
两种方法都是O(N)

编辑我刚刚意识到,你真正想要的不是生成一个已排序名称的列表,而是直接使用键对
L
进行排序:

In [26]: L
Out[26]: [[1, 'JAYCE'], [2, 'AMIE'], [3, 'JACK'], [4, 'STEVE'], [5, 'JAYCE']]

In [27]: from operator import itemgetter

In [28]: sorted(L, key=itemgetter(1))
Out[28]: [[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]

因此,只要您的数据表现良好,您就可以使用defaultdict将您的数字分组为DEQUE:

In [14]: from collections import defaultdict, deque

In [15]: grouper = defaultdict(deque)

In [16]: for a,b in L:
    ...:     grouper[b].append(a)
    ...:
然后简单地说:

In [17]: grouper
Out[17]:
defaultdict(collections.deque,
            {'AMIE': deque([2]),
             'JACK': deque([3]),
             'JAYCE': deque([1, 5]),
             'STEVE': deque([4])})

In [18]: [[grouper[x].popleft(), x] for x in sortedNames]
Out[18]: [[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
我意识到在列表中使用
pop
是一个丑陋的缺点

这里有一种仅使用
dict
list
的方法:

In [19]: grouper = {}
    ...: for a,b in L:
    ...:     grouper.setdefault(b, []).append(a)
    ...:

In [20]: grouper = {k:v[::-1] for k, v in grouper.items()}

In [21]: [[grouper[x].pop(), x] for x in sortedNames]
Out[21]: [[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
两种方法都是O(N)

编辑我刚刚意识到,你真正想要的不是生成一个已排序名称的列表,而是直接使用键对
L
进行排序:

In [26]: L
Out[26]: [[1, 'JAYCE'], [2, 'AMIE'], [3, 'JACK'], [4, 'STEVE'], [5, 'JAYCE']]

In [27]: from operator import itemgetter

In [28]: sorted(L, key=itemgetter(1))
Out[28]: [[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
您可以使用该函数执行此操作,并使用其
参数查找存储名称的位置:

finalList = sorted(L, key=lambda x: sortedNames.index(x[1]))
其结果是:

[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
您可以使用该函数执行此操作,并使用其
参数查找存储名称的位置:

finalList = sorted(L, key=lambda x: sortedNames.index(x[1]))
其结果是:

[[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]

你能对名字进行排序吗?
sorted
取一个关键参数
sorted([1,'JAYCE'],[2,'AMIE'],[3,'JACK'],[4,'STEVE'],[5,'JAYCE']],key=lambda x:x[1])
@f5r5e5d,为什么不用它自己的方法对列表进行排序呢?
L.sort(key=da x:x[1])
同样有效。
.append()
可以通过将
i
包装在列表中来修复:
finalist.append(L[0]+[i])
和另一个。。你能对名字进行排序吗?
sorted
取一个关键参数
sorted([1,'JAYCE'],[2,'AMIE'],[3,'JACK'],[4,'STEVE'],[5,'JAYCE']],key=lambda x:x[1])
@f5r5e5d,为什么不用它自己的方法对列表进行排序呢?
L.sort(key=da x:x[1])
同样有效。
.append()
可以通过将
i
包装在列表中来修复:
finalist.append(L[0]+[i])
和另一个。。