我有一个列表,其中包含要与字典索引进行比较的“索引”值。我希望字典值以与列表相同的顺序返回。下面的示例:
list =['a','b','c','d'...n]
dict = {'d':'fourth' ,'a': 'first','b':'second','c':'third'...n}
问题是,当我执行以下命令时:
sorted_list = [value for index, value in dict.items() if index in list]
我最终得到一个列表:
['fourth','first','second','third']
代替:
['first','second','third','fourth']
是否有办法确保排序保持原始列表顺序?
我无法更改字典顺序以匹配列表,因为列表可能具有不同的值组合。
答案 0 :(得分:2)
是的,只是遍历列表并从字典中获取值:
var app = require('tns-core-modules/application');
app.getNativeApplication().getResources().getIdentifier("color_name", "color", app.getNativeApplication().getPackageName());
输出
lst =['a','b','c','d']
dct = {'d':'fourth' ,'a': 'first','b':'second','c':'third'}
result = [dct[i] for i in lst]
print(result)
请注意,请勿将内置名称用作变量名称。上面的list comprehension等效于下面的['first', 'second', 'third', 'fourth']
循环:
for
如果您想要一个更强大的版本,可以使用get方法并提供默认值,如下所示:
result = []
for e in lst:
result.append(dct[e])
输出
lst =['a','b','c','d', 'f']
dct = {'d':'fourth' ,'a': 'first','b':'second','c':'third'}
result = [dct.get(e, 'missing') for e in lst]
print(result)
答案 1 :(得分:1)
使用
list(map(dct.get,lst))
Out[60]: ['first', 'second', 'third', 'fourth']
答案 2 :(得分:1)
这是使用operator.itemgetter
的简单方法:
l =['a','b','c','d']
d = {'d':'fourth' ,'a': 'first','b':'second','c':'third'}
itemgetter(*l)(d)
('first', 'second', 'third', 'fourth')
您的代码存在问题,因为您正在dict.items()
上进行迭代,因此将按照值在字典中的显示顺序提取值。您想以另一种方式进行此操作,从而通过遍历列表中的值以相同的顺序来获取字典中的值。
通过使用itemgetter
,您可以从d
获取l
中的所有元素,因此,这是我所说的一种更简洁的方法,也可以使用列表理解。
答案 3 :(得分:0)
取决于您的需求的几种选择:
from collections import OrderedDict
def ret(items, lookup):
# using a Generator, which you can then get items as needed. if you need all items, just cast to list
for li in items:
yield lookup[li]
def ret2(lookup):
# if all you are concerned with is alphanumeric sort by keys, use the inbuilt OrderedDict
lookup = OrderedDict(sorted(lookup.items(), key=lambda t: t[0]))
return lookup.values()
print (list(
ret(
items=['a','b','c','d'],
lookup={'d':'fourth' ,'a': 'first','b':'second','c':'third'}
)
))
print (ret2(lookup={'d':'fourth' ,'a': 'first','b':'second','c':'third'}))