0

辞書内のリストから空白の値を削除するプログラムに取り組んでいますが、値全体が単一のスペースのみを保持する単一の配列で構成されている場合は、単一のスペースを含む要素を削除する必要があります。

def CleanWhiteSpace(theDict) :
    stuff=[]
    for key2 in theDict.keys():
        for value2 in theDict.values(): 
            if value2 == [' ']:
                print key2
                del theDict[key2]
                print "hi"

    print theDict
    for key,value in theDict.iteritems():
        for d in value:
            print value
            if d != ' ':
                    stuff.append(d)    
            theDict[key]=stuff
        stuff=[]

    return theDict
print CleanWhiteSpace({'a':['1','2'],'b':['3',' '],'c':[' ']})

これでキーcを削除するだけです。

4

5 に答える 5

3

キーごとに、ループするのではなく、単一の値のみを確認する必要がありますtheDict.values()

def CleanWhiteSpace(theDict) :
    stuff=[]
    for key2 in theDict.keys():  # this is the line I changed
        if theDict[key2] == [' ']:
            print key2
            del theDict[key2]
            print "hi"

    print theDict
    for key, value in theDict.iteritems():
        for d in value:
            print value
            if d != ' ':
                    stuff.append(d)
            theDict[key]=stuff
        stuff=[]

    return theDict
print CleanWhiteSpace({'a':['1','2'],'b':['3',' '],'c':[' ']})
于 2012-06-13T22:29:11.263 に答える
2

他の人があなたの既存のコードの問題を指摘していますが、この問題にはもっと良い解決策があります:

{key: values for key, values in ((key, [item for item in values if not item == " "]) for key, values in data.items()) if values}

ここでは、ジェネレータ式とともに、dictとlistの内包表記の組み合わせを使用します。まず、ジェネレータ式を使用して各辞書アイテムを取得し、リストから単一のスペース文字列を削除します。次に、dict内包表記を使用して、このデータから辞書を再構築し、値が空のアイテムを無視します(これらはすべて削除されています)。

いつものように、dict.iteritems()またはdict.viewitems()2.xで使用します。

編集:巨大なコード行が気に入らない場合は、分離できることを忘れないでください。

def strip_items(items, strip):
    return [item for item in values if not item == strip]
stripped = ((key, strip_items(values, " ")) for key, values in data.items())
new_data = {key: values for key, values in stripped if values}
于 2012-06-13T22:30:38.310 に答える
2

これを試して:

def CleanWhiteSpace(entries):
    blank_keys = [key for key in entries if all([' ' == value for value in entries[key]])]
    for key in blank_keys:
        del entries[key]
    return entries


print CleanWhiteSpace({'a':['1','2'],'b':['3',' '],'c':[' ']})
于 2012-06-13T22:31:14.557 に答える
2

ネストされたループ

for key2 in theDict.keys():
    for value2 in theDict.values(): 
        if value2 == [' ']:
            print key2
            del theDict[key2]
            print "hi"

すべての単一キーのすべての値をループします。"c"結果は、辞書がキーを返すことを決定した順序によって異なります。最後にキーにアクセスした場合、辞書が空になることもあります。

必要なのは次のとおりです(Python 2.x):

for key, value in theDict.items():
    if value == [" "]:
        del theDict[key]

2つのスペースエントリのみで構成される値も削除する必要はありませんか?この場合、最初にスペースを削除し、その後、すべての空のリストを削除する方が簡単です。

d = {}
for key, value in theDict.iteritems():
    d[key] = [x for x in value if x != " "]
return {k: v for k, v in d.iteritems() if v}
于 2012-06-13T22:27:01.997 に答える
2

関数が機能しない理由はわかりませんが、簡単な方法は次のとおりです。

clean = {k: v for k, v in dct.items() if ''.join(v).strip()}

例えば:

dct = {'a':['1','2'],'b':['3',' '],'c':[' ']}
clean = {k: v for k, v in dct.items() if ''.join(v).strip()}
print clean # {'a': ['1', '2'], 'b': ['3', ' ']}
于 2012-06-13T22:36:19.610 に答える