0

私は Python でプログラミングすることになっていますが、Python を使ったのは 3 週間だけです。あらゆる種類の問題を解決し、トレーニングとして関数を作成する必要があります。私の機能の 1 つで、この行を使用します。

theDict = dict( [(k,v) for k,v in theDict.items() if len(v)>0])

ただし、完全に理解できない、または完全に説明できないものは使用できません。セリフの要点はわかるのですが、うまく説明できません。だから私のインストラクターは、これを使用するには、タプルに関するすべてを学び、リスト内包表記を完全に理解するか、純粋な python でそれを書かなければならないと言いました。

行は基本的に辞書を調べ、辞書内で空のリストと等しい値を探し、それらのキー/値を削除することになっています。

それで、私の質問は、この行は、純粋で非リスト内包のPythonではどのように見えるでしょうか? 頑張って書きたいので書いてみます。無料で回答が得られるサイトではありませんが、うまくいかない場合は修正して完成させてください。

また、別の問題は、辞書の「値」内の空のリストが空の場合、ループ内で処理されないことです。ループは、空の値に等しいキーを削除することになっています。では、チェックがループ内にあり、ループの本体に空の配列がない場合、リストが空であるかどうかをどのようにチェックするのでしょうか?

for key,value in TheDict.items(): #i need to add 'if value:' somewhere, 
#but i don't know how to add it to make it work, because 
#this checks if the value exists or not, but if the value 
#doesn't exist, then it won't go though this area, so 
#there is no way to see if the value exists or not. 
     theDict[key]=value

空のリストの値を持つ辞書値を削除するためのより良い方法がある場合。私にお知らせください。

そして、どのように

theDict = dict( [(k,v) for k,v in theDict.items() if len(v)>0])

ジェネレーターを使用しなかった場合のように見えますか?

4

8 に答える 8

7
result = dict([(k,v) for k,v in theDict.items() if len(v)>0])

次のようになります(新しい辞書が必要な場合)

result = {}
for key, value in theDict.items():
    if len(value) > 0:
        result[key] = value

既存の辞書を変更する場合:

for key, value in theDict.items():
    if not len(value) > 0:
        del theDict[key]
于 2012-06-14T10:52:01.137 に答える
4

if vv何らかの値があるかどうかを示しvます。dones に値がない場合、制御は条件に入らず、値をスキップします

In [25]: theDict={'1':'2','3':'', '4':[]}

In [26]: for k,v in theDict.items():
   ....:     if v:
   ....:         newDict[k]=v
   ....:

In [27]: newDict
Out[27]: {'1': '2'}

==========================

In [2]: theDict = { 1: ['e', 'f'], 2: ['a', 'b', 'c'], 4: ['d', ' '], 5: [] }

In [3]: newDict = {}

In [4]: for k,v in theDict.items():
   ...:     if v:
   ...:         newDict[k]=v
   ...:

In [5]: newDict
Out[5]: {1: ['e', 'f'], 2: ['a', 'b', 'c'], 4: ['d', ' ']}

入力に従って回答を更新しました...

于 2012-06-14T10:53:18.843 に答える
3

楽しみのためだけに:

from operator import itemgetter
theDict = dict(filter(itemgetter(1), theDict.items()))
于 2012-06-14T11:11:10.893 に答える
3

del辞書から要素を削除するには、次のキーワードを使用できます。

>>> d = {1: 2, 3: 4}
>>> d
{1: 2, 3: 4}
>>> del d[1]
>>> d
{3: 4}
>>> 

これはおそらく、まったく新しい辞書を生成するよりも効率的です。次に、上記と同様の構造を使用できます。

for k in theDict:
    if len(theDict[k]) == 0:
        del theDict[k]

それは理にかなっていますか?

于 2012-06-14T10:55:53.707 に答える
2
theDict = dict( [(k,v) for k,v in theDict.items() if len(v)>0])

ただし、完全に理解できない、または完全に説明できないものは使用できません。セリフの要点はわかるのですが、うまく説明できません。


バックグラウンド

Python での動作を理解またはデモする最も簡単な方法は、対話型インタープリターを使用することです。
python -i

対話型インタープリターには、非常に便利なコマンドが 2 つあります。

  • dir- オブジェクトのオプションの引数を取り、オブジェクトの属性のリストを返します。
  • help- インライン ドキュメントにアクセスします

を使用dirして、たとえば、オブジェクトが持つメソッドを見つけてから、 を使用してドキュメントを参照できますhelp


問題の行を説明する

サンプル辞書は次のとおりです。

>>> theDict = dict(a=[1,2],b=[3,4],c=[])
>>> theDict
{'a': [1, 2], 'c': [], 'b': [3, 4]}

リスト内包表記は、キーと値のペアのリストをタプルとして返します。

>>> [(k,v) for k,v in theDict.items()]
[('a', [1, 2]), ('c', []), ('b', [3, 4])]

このifステートメントは、結果のリストをフィルタリングします。

>>> [(k,v) for k,v in theDict.items() if len(v) > 0]
[('a', [1, 2]), ('b', [3, 4])]

dictは、一連のキーと値のペアでインスタンス化できます。

>>> dict([(k,v) for k,v in theDict.items() if len(v) > 0])
{'a': [1, 2], 'b': [3, 4]}

すべてを一緒に入れて:

>>> theDict = dict(a=[1,2],b=[3,4],c=[])
>>> theDict
{'a': [1, 2], 'c': [], 'b': [3, 4]}
>>> theDict = dict([(k,v) for k,v in theDict.items() if len(v) > 0])
>>> theDict
{'a': [1, 2], 'b': [3, 4]}

元の dict オブジェクトは、そのキーと値のペアのリスト内包表記フィルター処理されたリストを使用してインスタンス化された新しいものに置き換えられます。

このすべてに従う (そして対話型インタープリターで自分で操作する) と、質問したこのコード行で何が起こっているのかが理解できます。

于 2012-06-14T13:30:29.873 に答える
1

おそらく必要なのは、空の値としてadefaultdictを持つ aです。list

于 2012-06-14T12:54:44.603 に答える
1

多かれ少なかれ読みやすい方法で関数を次に示します。

def clean_whitespace(dct):
    out = {}
    for key, val in dct.items():
        val = map(str.strip, val)
        val = filter(None, val)
        if val:
            out[key] = val
    return out

または、理解を使用して、

def clean_whitespace(dct):
    out = {}
    for key, val in dct.items():
        val = [x.strip() for x in val]
        val = [x for x in val if x]
        if val:
            out[key] = val
    return out

コメントや説明が必要な場合はお知らせください。

于 2012-06-14T13:26:03.633 に答える
0

解決策は私の鼻の下にありました。ごめんなさいみんな。助けてくれてありがとう +1 みんなのために

def CleanWhiteSpace(theDict) :
    for k,v in theDict.items():
        if not v:
            del theDict[k]
    return theDict
于 2012-06-14T13:26:56.710 に答える