Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dict作为容器的python字典行为_Python_Python 2.7_Dictionary - Fatal编程技术网

使用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'