2016-12-10 53 views
1

我试图用排序任务作为重点的字典,并试图解开他们是否有在字典多个译者:使用排序()在字典

因此,例如,后

我迭代键和值,因为key ['harry potter volume 24']有2个可能的翻译器,我想用其他一些参数解开它们(例如,1 *,但由于我总是使用lambda dicts迭代器,所以没有运气得到的错误,它是超出范围同样的事情时,我改变了字典到列表

任何ideias感谢

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

很难说出你想要做什么。你能发表一个你想要的输出的例子吗? – shadowtalker

+3

另外一般来说,隐藏一个内置函数是一个非常糟糕的主意。不要把事情分配给'dict'。 – shadowtalker

+0

如果您不发布代码,也无法告诉您的代码有什么问题。 – shadowtalker

回答

0

简单,使用list.sort,来得好,未做任何数据复制(除非这是你想要的)

>>> 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并从那里,我们希望你所说的“速度”(W这意味着在这里),我把它转换成一个浮点数,因此它是由它的数值指定的,其余的应该是自我解释的

+0

这工作有点像我想要它!但我有一个新问题,我不知道我是否应该在这里或在新线程 – stasisOo

+0

很高兴你喜欢它。如果这个新问题不是关于排序这本字典或排序的东西,我认为一个新的线程是正确的选择 – Copperfield

+0

ups已经更新,但生病擦除该部分,并创建一个新的,希望你也可以在那里帮助!非常感谢! – stasisOo

0

一个可以传递key参数来sorted功能 - 这就是将参加的项目进行排序,并返回另一个Python对象,将与内置自然比较功能在运营商。

因此,您可以在函数中使用任何复杂度作为“关键”,并且仍然可以在一次调用中完成所有排序。 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) 
0

的错误是因为newList你演示的其实是一个列表列表

在这里它是“适合打印”:

[ 
    [ 
     [ 
      "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]失败,因为它在长度二列表上被调用。