我试图用任务作为关键词对dict进行排序,如果dict中有多个翻译器,则尝试解开它们:
例如,在我迭代键和值之后,因为键['哈利波特音量24']有2个可能的翻译器,我想用其他一些参数来解开它们(例如, 1 *但是没有运气使用lambda dicts迭代器,因为我总是得到它超出范围的错误。当我将dict转换为列表时同样的事情。
任何想法?感谢
Edit1:已删除以进行替换。
Edit2:
newList = []
for k,v in dic.iteritems():
if len(v) > 1:
newList.append(v)
#now i'm trying to use sorted to untie it on a parameter
#(for example the speed which is the 4 position on a list of lists so then i can return the
#[0] position translator)
n = sorted(newList, key=lambda t:t[4])
Traceback (most recent call last):
File "C:\Users\Família\Desktop\functions_dict.py", line 70, in <module>
n = sorted(newList, key=lambda t:t[4])
File "C:\Users\Família\Desktop\functions_dict.py", line 70, in <lambda>
n = sorted(newList, key=lambda t:t[4])
IndexError: list index out of range
答案 0 :(得分:0)
可以将key
参数传递给sorted
函数 - 这是一个将要对要排序的项进行处理的函数,并返回另一个将与内置函数自然比较的Python对象运算符。
因此,您可以将函数中的任何复杂度用作&#34; key&#34;,并且仍然可以在一次调用中完成所有排序。 Key函数接受一个Python对象 - 在字典的情况下,您将需要一个键元组,例如由items
方法提供的值。
但是在第二次阅读时,您想要对值进行排序,而不管键是什么 - 是的,需要一次调用才能对每个字典项进行排序:
def mykey(translator):
if not translator:
return '' # returns empty lists and avoids index error
key = translator[1][2] # Should be string '*1' in your example;
# concatenate the return value with more
# fields if needed.
return key
new_dict = {}
for key, value in dicionary.items()
# Don't use iteritems - it is Python3 incompatible, and buys you almost nothing but for HUGE datasets
# Also avoid one letter variables if they don't improve readability
new_dict[key] = sorted(value, key=mykey)
答案 1 :(得分:0)
错误是因为您展示的newList
实际上是列表。
这是&#34;漂亮的印刷&#34;:
[
[
[
"Ana Tavares",
[
"(english)",
"(portuguese)",
"1*",
"0.701",
"2000",
"20000",
"2304",
"08:11:2016"
]
],
[
"Rita Carvalho",
[
"(english)",
"(portuguese)",
"1*",
"0.633",
"5000",
"400000",
"18023",
"09:11:2016"
]
]
]
]
newList
实际上是一个包含一个元素的列表,另一个列表。也就是说,数据结构是这样的:
- list:
- list:
- list:
- string
- list, containing:
- string
- string
- string
- string
- string
- string
- string
- string
- list:
- string
- list, containing:
- string
- string
- string
- string
- string
- string
- string
- string
我怀疑这不是您打算生成的数据结构。但是你得到错误的原因是你在最外面的列表上调用sorted
,它只有一个元素。反过来,该元素只有两个元素。所以lambda t: t[4]
失败了,因为它是在长度为二的列表中调用的。
答案 2 :(得分:0)
简单,使用list.sort,将dict内部的元素和这些列表中的元素排序,而不对数据进行任何复制(除非那就是你想要的)
>>> test={'com os holandeses': [], 'harry potter volume 24': [('Ana Tavares', ['(english)', '(portuguese)', '1*', '0.501', '2000', '20000', '2304', '08:11:2016']), ('Rita Carvalho', ['(english)', '(portuguese)', '1*', '0.633', '5000', '400000', '18023', '09:11:2016'])], 'emailToJane': [('Paula Guerreiro', ['(french)', '(portuguese)', '2*', '0.900', '3500', '45000', '21689', '11:11:2016'])], 'osudy dobrého vojáka Å\xa0vejka za svÄ\x9btové války': [('Mikolás Janota', ['(czech)', '(english; portuguese)', '3*', '1.780', '2000', '200000', '4235', '08:11:2016'])]}
>>>
>>> from pprint import pprint
>>> pprint(test['harry potter volume 24'])
[('Ana Tavares',
['(english)',
'(portuguese)',
'1*',
'0.501',
'2000',
'20000',
'2304',
'08:11:2016']),
('Rita Carvalho',
['(english)',
'(portuguese)',
'1*',
'0.633',
'5000',
'400000',
'18023',
'09:11:2016'])]
>>> for v in test.values():
v.sort(key=lambda t: float(t[1][3]), reverse=True)
>>> pprint(test['harry potter volume 24'])
[('Rita Carvalho',
['(english)',
'(portuguese)',
'1*',
'0.633',
'5000',
'400000',
'18023',
'09:11:2016']),
('Ana Tavares',
['(english)',
'(portuguese)',
'1*',
'0.501',
'2000',
'20000',
'2304',
'08:11:2016'])]
>>>
交易的内容在这里
for v in test.values():
v.sort(key=lambda t: float(t[1][3]), reverse=True)
t
是每个列表中的每个元素,在您的情况下,它可以表示为(Name,ListData)
,然后t[1]
表示ListData,从那里我们想要您所谓的“速度”(无论这意味着什么),我将其转换为浮点数,因此它是数字值的订购者,其余的应该是自我解释的