阅读Python 3.1中的更改,我发现了一些......意外的:
sys.version_info元组现在是一个命名元组:
我之前从未听说过命名元组,我认为元素可以用数字(如元组和列表)或键(如dicts)索引.我从没想过他们可以两种方式编入索引.
因此,我的问题是:
我已经阅读了python文档中的示例,但仍然无法弄清楚这个方法的含义.有人可以帮忙吗?以下是python文档中的两个示例
>>> from collections import defaultdict
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
... d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
Run Code Online (Sandbox Code Playgroud)
和
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
... d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
Run Code Online (Sandbox Code Playgroud)
参数int和list用于什么?
哪个是用另一个字典扩展字典的最佳方法?例如:
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
Run Code Online (Sandbox Code Playgroud)
我正在寻找任何操作来获得这个避免for循环:
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
Run Code Online (Sandbox Code Playgroud)
我希望做的事情如下:
a.extend(b) # This does not work
Run Code Online (Sandbox Code Playgroud) 我怎么能把这样的词典列表
[{'a':1}, {'b':2}, {'c':1}, {'d':2}]
Run Code Online (Sandbox Code Playgroud)
进入这样一个单词
{'a':1, 'b':2, 'c':1, 'd':2}
Run Code Online (Sandbox Code Playgroud) 在Python 2中,我可以执行以下操作:
>> d = {'a':1}
>> extras = [{'b':2}, {'c':4}]
>> map(d.update, extras)
>> d['c']
>> 4
Run Code Online (Sandbox Code Playgroud)
在Python 3中得到一个KeyError:
>> d = {'a':1}
>> extras = [{'b':2}, {'c':4}]
>> map(d.update, extras)
>> d['c']
>> KeyError: 'c'
Run Code Online (Sandbox Code Playgroud)
我想在Python 3中实现与Python 2中相同的行为.
我知道Python 3中的map将返回一个迭代器(lazy evaluation和whatnot),必须迭代它才能更新字典.
我假设d['c']密钥查找会以某种方式触发映射迭代,但事实并非如此.
有没有pythonic方法来实现这种行为而不编写for循环,我发现与map相比,它是冗长的.
我想过使用列表推导:
>> d = {'a':1}
>> extras = [{'b':2}, {'c':4}]
>> [x for x in map(d.update, extras)]
>> d['c']
>> 4
Run Code Online (Sandbox Code Playgroud)
但它似乎并不像pythonic.
最近我一直试图映射一些值,所以我试图创建一个字典来做到这一点.奇怪的是我的DataFrame有一个由列表组成的列,而DataFrames总是有点笨拙的列表.DataFrame具有以下结构:
rules procedure
['10','11','12'] 1
['13','14'] 2
['20','21','22','24'] 3
Run Code Online (Sandbox Code Playgroud)
所以我想创建一个字典,将'10'映射到1,'14'映射到2,依此类推.我尝试了以下方法:
dicc=dict()
for j in df['rules']:
for i,k in zip(j,df.procedure):
dicc[i]=k
Run Code Online (Sandbox Code Playgroud)
但那不是成功的.可能与索引有关.我错过了什么?
编辑:我正在尝试创建一个将值'10','11','12'映射到1的字典; '13','14'到2; '20','21','22','24'到3,所以如果我打字dicc['10']我得到1,如果我输入dicc['22']我得到3.显然,实际的DataFrame非常大,我无法手动完成.
我有好几本这样的字典
dict1 = {0: 33.422, 1: 39.2308, 2: 30.132}
dict2 = {0: 42.2422, 1: 43.342, 2: 42.424}
dict3 = {0: 13.422, 1: 9.2308, 2: 20.132}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用代码将它们组合成一本字典
dicts = dict1, dict2, dict3
Run Code Online (Sandbox Code Playgroud)
它返回这样的结果
({0: 33.422, 1: 39.2308, 2: 30.132}, {0: 42.2422, 1: 43.342, 2: 42.424}, {0: 13.422, 1: 9.2308, 2: 20.132})
Run Code Online (Sandbox Code Playgroud)
但是,如果字典按顺序出现呢?我怎样才能得到相同的结果?我尝试了以下代码
dicts = {}
dicts = dicts, dict1
dicts = dicts, dict2
dicts = dicts, dict3
Run Code Online (Sandbox Code Playgroud)
但它返回这样的结果
((({}, {0: 33.422, 1: 39.2308, 2: 30.132}), {0: 42.2422, 1: 43.342, 2: 42.424}), …Run Code Online (Sandbox Code Playgroud) python ×6
dictionary ×5
python-3.x ×2
dataframe ×1
defaultdict ×1
map-function ×1
namedtuple ×1
pandas ×1
python-2.7 ×1
tuples ×1