6

リストの辞書で、各リストの最後の要素を削除するためのよりPython的または効率的な方法は何ですか?

たとえば、次のようにします。

listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]}

そしてそれをこれに変換します:

listDict = {'tom': [-2,10,2], 'sam': [-9,-10,-10]}

これは私が現在行っていることです:

new = {}
for t,item in listDict.iteritems():
    new[t] = [item[0], item[1], item[2]]
listDict= new
4

5 に答える 5

8

私は辞書の理解を使用します:

new_dict = {key: value[:-1] for key, value in listDict.items()}

dict()古いバージョンのPythonの場合、コンストラクターを使用する必要があります。

new_dict = dict((key, value[:-1]) for key, value in listDict.items())
于 2012-08-11T05:12:09.017 に答える
8

このソリューションと比較して、リストの長さが長くなるにつれて、Blenderの答えは非常に非効率的になります。

for k, v in listDict.items():
    v.pop()

あなたの例listDictでは、違いは大きくなく、27%です。しかし、100個のキーと50から100までの長さのリストを持つdictを使用し、そのうちの50個をポップすると、dictの理解方法には12倍以上の時間がかかります。これは、このソリューションが毎回各リストのコピーを作成するのではなく、既存のリストを変更するためです。

あなたが浮気していない限り、これのワンライナーバージョンはないのではないかと思います。私がこれに言及する理由は、一部のDofusがコメントでそれを指摘せざるを得ないと感じるのを防ぐためです。副作用のためにdict/list内包表記を使用しないでください。

もちろん、次のように1行で実行できますが、PEP8は「そうではない」と言っています。

for k, v in listDict.items(): v.pop()
于 2012-08-11T05:38:08.093 に答える
2

その場で変更が必要な場合、この代替手段では、新しい辞書を作成したり、その他の再割り当てを行う必要はありません。

listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]}
for i in listDict.values():
    i.pop()

また、新しいリストを作成する必要はありません。リストは変更可能であることを忘れないでください。

新しいdictとリストが必要な場合は、前の応答の方が適しています。

于 2012-08-11T05:43:59.757 に答える
1

スコアを維持するためだけに:

def f1():
    listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]}
    return {key: value[:-1] for key, value in listDict.items()}

def f2():
    listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]}
    for k, v in listDict.items():
        v.pop()    

    return listDict    


cmpthese.cmpthese([f1,f2])       

プリント:

   rate/sec    f1     f2
f1  571,487    -- -23.5%
f2  746,966 30.7%     --
于 2012-08-11T05:54:35.313 に答える
0

あなたが使用することができるならばpandas、これを与えられてdict

listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]}

次のように最後の要素を削除します。

import pandas 
df = pandas.DataFrame(data=listDict)
new = df[:-1]
print(new)

生成するもの:

   tom  sam
0   -2   -9
1   10  -10
2    2  -10

あなたがそれをその時として望むならdict

print(new.to_dict('list'))

生成するもの:

{'tom': [-2, 10, 2], 'sam': [-9, -10, -10]}
于 2021-04-02T14:54:22.630 に答える