簡體   English   中英

按值對字典列表進行排序,無論python中的鍵名如何

[英]Sort list of dictionaries by value, regardless of keyname in python

我有一個單入字典的列表。 每個字典只有1個鍵和1個值。 我想按關鍵字名稱的這些值對字典列表進行排序! 字典之間的鍵名既相同又不同。

我看到的所有在線示例在各個字典中都假定使用相同的鍵名。 這些類型的示例對我不起作用,因為它們假定相同的鍵值:

newlist = sorted(list_to_be_sorted, key=lambda k: k['name'])

在我的示例中,無論密鑰是bob還是sarah,我都需要比較這些值; 並訂購字典清單。 這是字典的示例列表:

Times = [{"Bob":14.05}, {"Tim":15.09}, {"Tim":17.01}, {"Bob":16.81}, {"Sarah":15.08}]

所需的輸出:

[{"Bob":14.05}, {"Sarah":15.08}, {"Tim":15.09}, {"Bob":16.81}, {"Tim":1701}]
times = [{"Bob":14.05},{"Tim":15.09},{"Tim":17.01},{"Bob":16.81},{"Sarah":15.08}]
print sorted(times, key=lambda k: k.values())

輸出量

[{'Bob': 14.05},{'Sarah': 15.08}, {'Tim': 15.09}, {'Bob': 16.81}, {'Tim': 17.01}]

如果values列表中有多個值,並且只想考慮特定索引處的元素,則可以執行

print sorted(times, key=lambda k: k.values()[0])

關於什么:

newlist = sorted(Times, key=lambda k: k.values()[0])

它關閉了字典的.values()的第一個(唯一.values()

@thefourtheye-您的答案非常好。

想要向剛接觸python的人們強調一個微妙的和IMO有趣的事情。 考慮一下對fourtheye答案的調整:

times = [{"Bob":14.05},{"Tim":15.09},{"Tim":17.01},{"Bob":16.81},{"Sarah":15.08}]
print sorted(times, key=lambda k: k.itervalues().next())

產生相同的結果:

[{'Bob': 14.05}, {'Sarah': 15.08}, {'Tim': 15.09}, {'Bob': 16.81}, {'Tim': 17.01}]

該調整避免了中間和不必要的數組的創建。 通過使用迭代器“ itervalues()”,然后僅獲取第一個值(通過.next()),sort方法僅比較原始值,而不使用數組。

讓我們看一下性能:

test_cases = [
    [],
    [{"Bob":14.05}],
    [{"Bob":14.05},{"Tim":15.09},{"Tim":17.01},{"Bob":16.81},{"Sarah":15.08}],
    [dict(zip((str(x) for x in xrange(50)), random.sample(xrange(1000), 50)))]      # 50 dict's in a list
]
print "perf test"
for test_case in test_cases:
    print test_case

    print "k.values()           :", timeit.repeat(
        "sorted(test_case, key=lambda k: k.values())",
        "from __main__ import test_case",
    )
    print "k.itervalues().next():", timeit.repeat(
        "sorted(test_case, key=lambda k: k.itervalues().next())",
        "from __main__ import test_case",
    )
    print

結果:

[]
k.values()           : [0.7124178409576416, 0.7222259044647217, 0.7217190265655518]
k.itervalues().next(): [0.7274281978607178, 0.7140758037567139, 0.7135159969329834]

[{'Bob': 14.05}]
k.values()           : [1.3001079559326172, 1.395097017288208, 1.314589023590088]
k.itervalues().next(): [1.2579071521759033, 1.2594029903411865, 1.2587871551513672]

[{'Bob': 14.05}, {'Tim': 15.09}, {'Tim': 17.01}, {'Bob': 16.81}, {'Sarah': 15.08}]
k.values()           : [3.1186227798461914, 3.107577085494995, 3.1108040809631348]
k.itervalues().next(): [2.8267030715942383, 2.9143049716949463, 2.8211638927459717]

[{'42': 771, '48': 129, '43': 619, '49': 450, --- SNIP --- , '33': 162, '32': 764}]
k.values()           : [1.5659689903259277, 1.6058270931243896, 1.5724899768829346]
k.itervalues().next(): [1.29836106300354, 1.2615361213684082, 1.267350196838379]

請注意,性能通常並不重要,但是鑒於這兩種解決方案在可讀性,表達能力方面相似,因此我認為最好理解后面的解決方案並養成這些習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM