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])
和另一个。。