排序后从dict创建键列表和值[0]

时间:2016-12-11 02:46:49

标签: list dictionary

我试图使用每个键的值列表来过滤dict中的一些信息,如果有超过1个值,我们选择更好的一个,就是这种情况,如果[1] [3]位置越高,其排序也相应。

for key, value in dic.items():
    if len(value) < 1:
        newList.append(TranslatorToTask('NOTAssigned', key))
    if len(value) == 1:
        newList.append(TranslatorToTask(value[0], key))
    if len(value) > 1:
        for v in dic.values():
            v.sort(key=lambda t: float(t[1][3]), reverse = True)
            newList.append(TranslatorToTask(value[0], key))

但是,当我打印newList时,它会出现如下:

除了不返回第一个位置翻译器的else语句之外的所有工作,也会再运行3次。

有关预期结果的信息:和使用过的功能:

def TranslatorToTask(translator, task):

    newList = [translator, task]
    return newList

虽然即时通讯询问,如果比较的值相等,是否有可能将其他值排序?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这部分

for v in dic.values():
    v.sort(key=lambda t: float(t[1][3]), reverse = True)

我在你的另一个问题中给你的是对整个字典中的每个元素进行排序,在本地使用,因为你想在这里使用它,你只需要排序部分

for key, value in dic.items():
    if len(value) < 1:
        newList.append(TranslatorToTask('NOTAssigned', key))
    if len(value) == 1:
        newList.append(TranslatorToTask(value[0], key))
    if len(value) > 1:
        value.sort(key=lambda t: float(t[1][3]), reverse = True) #<-- only the sort
        newList.append(TranslatorToTask(value[0], key))

或者您只想要t[1][3]值最大的元素,您可以使用max(或min作为另一个极端)函数,它也接受一个关键函数,如这个

max( value, key=lambda t: float( t[1][3] )

导致此

for key, value in dic.items():
    if len(value) < 1:
        newList.append(TranslatorToTask('NOTAssigned', key))
    if len(value) == 1:
        newList.append(TranslatorToTask(value[0], key))
    if len(value) > 1:
        newList.append( TranslatorToTask( max( value, key=lambda t: float(t[1][3])), key) )

它也接受一个默认值,以防你给它的列表为空,这是你从中得到的值,它可以将这段代码减少到这个:

for key, value in dic.items():
    newList.append( TranslatorToTask( max( value, key=lambda t: float(t[1][3]), default='NOTAssigned'), key ) )

(因为空列表的最大值是默认值,只有1个元素的列表中的最大值是该元素,而具有2个或更多元素的列表中的最大值是好的,根据键函数的最大值)

错误就在这里

for key, value in dic.items():
    ...
    if len(value) > 1:
        for v in dic.values():
            v.sort(key=lambda t: float(t[1][3]), reverse = True)
            newList.append(TranslatorToTask(value[0], key))  #<---here

此附加执行的次数与字典中的键一样多次

这也就是TranslatorToTask函数会做的所有事情,只是直接编写它而不是只为那个函数创建函数