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

你的嵌套循环

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]

您是否还需要删除仅包含两个空格条目的值?在这种情况下,首先删除空格,然后删除所有空列表会更容易:

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

其他人已经指出了您现有代码中的问题,但是,有一个更好的解决方案来解决这个问题:

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

在这里,我们结合使用dict 和列表推导,以及生成器表达式。我们首先使用生成器表达式来获取每个字典项并从列表中删除任何单个空格字符串。然后,我们使用 dict 推导从这些数据中重建字典,忽略任何具有空值的项目(它们都已被删除)。

与往常一样,在 2.x中使用dict.iteritems()或。dict.viewitems()

编辑:请记住,如果您不喜欢庞大的代码行,可以将其分开。

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

不知道为什么您的功能不起作用,但这里有一个更短的方法:

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 回答