在dict上使用sorted()

时间:2016-12-10 23:25:17

标签: python list

我试图用任务作为关键词对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

3 个答案:

答案 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,从那里我们想要您所谓的“速度”(无论这意味着什么),我将其转换为浮点数,因此它是数字值的订购者,其余的应该是自我解释的