我有点词典,说:
>>> points={'a':(3,4), 'b':(1,2), 'c':(5,5), 'd':(3,3)}
我想创建一个新的字典,其中包含x和y值小于5的所有点,即点'a','b'和'd'.
根据该书,每个字典都有items()函数,它返回一个(key, pair)  元组列表:
>>> points.items()
[('a', (3, 4)), ('c', (5, 5)), ('b', (1, 2)), ('d', (3, 3))]
所以我写了这个:
>>> for item in [i for i in points.items() if i[1][0]<5 and i[1][1]<5]:
...     points_small[item[0]]=item[1]
...
>>> points_small
{'a': (3, 4), 'b': (1, 2), 'd': (3, 3)}
有更优雅的方式吗?我期待Python有一些超级棒的dictionary.filter(f)功能......
我正在构建一个子类dict和覆盖的类__setitem__.我想确定我的方法将在可能设置字典项的所有实例中被调用.
我发现了三种情况,Python(在这种情况下,2.6.4)__setitem__在设置值时不会调用我的重写方法,而是PyDict_SetItem直接调用
setdefault方法中update方法中作为一个非常简单的测试:
class MyDict(dict):
    def __setitem__(self, key, value):
        print "Here"
        super(MyDict, self).__setitem__(key, str(value).upper())
>>> a = MyDict(abc=123)
>>> a['def'] = 234
Here
>>> a.update({'ghi': 345})
>>> a.setdefault('jkl', 456)
456
>>> print a
{'jkl': 456, 'abc': 123, 'ghi': 345, 'def': '234'}
您可以看到仅在显式设置项时才调用重写的方法.为了让Python始终调用我的__setitem__方法,我不得不重新实现这三种方法,如下所示:
class MyUpdateDict(dict):
    def __init__(self, *args, **kwargs):
        self.update(*args, **kwargs)
    def __setitem__(self, key, value):
        print "Here"
        super(MyUpdateDict, self).__setitem__(key, value)
    def update(self, *args, **kwargs): …我有一个create_group带有可选参数的函数user_device=None。如果为 提供了非 None 值user_device,我希望字典targeting_spec包含键值对"user_device": user_device,如果没有提供非 None 值,我不想targeting_spec包含此键值对。
我现在怎么做:
def create_group(..., user_device=None, ...):
    ...
    targeting_spec = {
        ...
    }
    if user_device:
        targeting_spec["user_device"] = user_device
    ...
这是一种公认的做法吗?如果不是,那是什么?我问是因为这似乎是 Python 喜欢优雅解决的类型。
我有一个像这样的python字典:
{
"addressLineOne": self.ADDRESS_1,
"addressType": "RESIDENTIAL",
"city": self.CITY,
"countryCode": "USA",
"email": self.EMAIL,
"firstName": self.FIRST_NAME,
"state": self.STATE
}
我希望一些值以我目前正在做的方式为条件,如下所示:
if self.login:
    data = {"addressLineOne": self.ADDRESS_1,
            "addressType": "RESIDENTIAL",
            "city": self.CITY,
            "countryCode": "USA",
            "state": self.STATE}
else:
    data = {"addressLineOne": self.ADDRESS_1,
            "addressType": "RESIDENTIAL",
            "city": self.CITY,
            "countryCode": "USA",
            "email": self.EMAIL,
            "firstName": self.FIRST_NAME,
            "state": self.STATE}
有没有更整洁的方法来做到这一点,所以我不需要两次编写字典,例如在字典中包含一个 if/else 语句?
是否可以在dict文字中使用"可选"键,而不是将它们添加到if语句中?
像这样:
a = True
b = False
c = True
d = False
obj = {
    "do_a": "args for a" if a,
    "do_b": "args for b" if b,
    "do_c": "args for c" if c,
    "do_d": "args for d" if d,
}
#expect:
obj == {
    "do_a": "args for a",
    "do_c": "args for c",
}
编辑上下文:我知道如何做逻辑:)我只是想避免if语句,因为我的对象是一个代表声明性逻辑的大块数据,所以移动的东西有点像"意大利面条编码"的东西不是根本就是程序性的.我希望对象的值"看起来像它意味着什么"作为查询.
它实际上是一个弹性搜索查询,所以它看起来像这样:
{
    "query": {
        "bool": {
            "must": [
                 <FILTER A>,
                 <FILTER B>,  # would like to make this filter optional …