0

我应该用 Python 编程,而我只使用 Python 3 周。我必须解决各种问题并编写函数作为训练。对于我的一个功能,我使用这条线。

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 v表示是否v有某个值,如果v没有任何值,控制将不进入条件并跳过该值

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

要从字典中删除元素,可以使用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 回答
3

只是为了好玩:

from operator import itemgetter
theDict = dict(filter(itemgetter(1), theDict.items()))
于 2012-06-14T11:11:10.893 回答
2
theDict = dict( [(k,v) for k,v in theDict.items() if len(v)>0])

但是我不能使用任何我不完全理解或不能完全解释的东西。我理解这条线的要点,但是,我无法真正解释它。


背景

在 python 中理解或演示行为的最简单方法是使用交互式解释器:
python -i

在交互式解释器中有两个非常有用的命令:

  • 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

您可能想要的是defaultdictalist作为空值。

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