使用dict作为容器的python字典行为
下面是这个问题的简化代码片段使用dict作为容器的python字典行为,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,下面是这个问题的简化代码片段 >>> dict ({'A': 58, 'B': 130} for _ in range(1)) {'A': 'B'} 我希望它能返回传入的同一本词典 如果我这样做 >>> dict({'A': 58, 'B': 130}) 我得到的正是我想要的,那就是 {'A':58,'B':130} 为什么这种行为不同,如何修复? 我不能改变那里的表达式,但是我可以用我喜欢的任何方式改变输入字典,例如,我可以像[{'A':58,'B':1
>>> dict ({'A': 58, 'B': 130} for _ in range(1))
{'A': 'B'}
我希望它能返回传入的同一本词典
如果我这样做
>>> dict({'A': 58, 'B': 130})
我得到的正是我想要的,那就是
{'A':58,'B':130}
为什么这种行为不同,如何修复?
我不能改变那里的表达式,但是我可以用我喜欢的任何方式改变输入字典,例如,我可以像[
{'A':58,'B':130}]一样传递它。
一个dict可以用另一个dict初始化,或者用一个iterable of pairs初始化,这就是您给它的。请注意,对dict进行迭代只会生成其键
>>> d = {'A': 58, 'B': 130}
>>> list(d)
['A', 'B']
>>> dict([('A', 'B'), ('C', 'D')])
{'A': 'B', 'C': 'D'}
>>> dict([d, ('C', 'D')])
{'A': 'B', 'C': 'D'}
Python完全按照指定的方式运行。您的dict恰好是一对。因为它只会使它成为
['a','B']
,同时还具有列表
:
>>> list({'A': 58, 'B': 130})
['A', 'B']
>>>
由于它在dict
中迭代,因为它是一个字典列表,它将使所有字典都成为list
,因此:
>>> dict([{'A': 58, 'B': 130}])
{'A': 'B'}
>>> dict({'A': 58, 'B': 130})
{'A': 58, 'B': 130}
>>>
此外,如果没有dict
,它将为字典列表执行如下操作:
>>> {*{'A': 58, 'B': 130}}
{'A', 'B'}
>>>
只是用一种类似字典的方式,但你现在应该得到它。你正在传递的这篇文章有一些特别之处<代码>({A':58,'B':130}表示范围(1)中的uu))表示长度为1的生成器序列。你正在通过的与
dict([{'A': 58, 'B': 130}])
# {'A': 'B'}
另一方面,这些措施将不起作用:
dict([{'A':58}])
# ValueError: dictionary update sequence element #0 has length 1; 2 is required
dict([{'A':58, 'B': 130, 'C': 150}])
ValueError: dictionary update sequence element #0 has length 3; 2 is required
第一个示例之所以有效,是因为您的词典正好有两个条目
序列被传递给dict
方法,该方法获取创建键值对所需的两项,并创建如下字典:
{'A': 'B'}
IOW,它需要一个可数对,这就是包含两个条目的单个dict的序列。其他任何操作都会抛出一个
ValueError
{a':58,'B':130}。对于范围(1)
中的{u},将产生[{a':58,'B':130}]
,因此您将一个列表而不是一个dict传递给dict()
根据文档,如果您将iterable传递给dict()
,您将得到:
d = {}
for k, v in iterable:
d[k] = v
因为列表中的dict正好有两个元素,k,v in iterable:循环得到dict中的前两个键。如果dict只有一个元素,或者有两个以上的元素,你会得到一个
ValueError
Re:“修复它”:我不明白这是怎么可能的(至少,没有太多的黑客攻击)。您正在使用长度为1的iterable(更准确地说,是生成器)初始化dict,因此生成的字典将有1项,而不是2项。为什么您会说“我无法更改那里的表达式,但我可以以任何方式更改输入字典”?这是某种黑客难题吗?给我们确切的规定,我们也许能找到办法。(例如,如果您只需要那里的任何字符串,dict(范围(1)中{A':58,'B':130}中的项的项()将起作用)
是否可以更改dict初始值设定项dict({'A':58,'B':130}表示范围(1)[0])
@ImperishableNight该表达式是python库/模块的一部分,我无法更改。确切的表达式是“func1(func2表示范围(1))内的uu”)。func1是一个容器,在我的例子中是dict,func2返回另一个dict,如上所述。可能它希望您更改func1
。范围(1)中的uuu的似乎是一种机制,赋予func1
是否调用func2
的自由,而不是试图生成容器的实际元素。同样,如果没有所述库的名称,我只能猜测。我不明白的是,如何在列表上进行简单的迭代来生成内部元素。我期望从iter的[{'A':58,'B':130}]
中得到的是{'A':58,'B':130}
,它是列表[0]
元素。里面没有什么。这里出了什么问题?@joe让第一个做:dict([{'A':58,'B':130}][0])
我明白你的意思,但我不明白的是-如何在列表上进行简单的迭代来生成内部元素。我期望从iter的[{'A':58,'B':130}]
中得到的是{'A':58,'B':130}
,它是列表[0]
元素。里面没有什么。这里出了什么问题?对于k,iterable中的v
获取iterable
中的每个值,然后迭代该值以提取k
和v
。在您的示例中,iterable
是一个包含一个dict的列表。在dict上迭代会产生键,因此k
和v
变成'a'
和'B'
。