给定一个名为'x'的浮点列表,我想创建一个dict,使用dict理解将x [1:-1]中的每个x映射到它的邻居.我试过以下一行:
neighbours = {x1:(x0,x2) for (x0,x1,x2) in zip(x[:-2],x[1:-1],x[2:])}
Run Code Online (Sandbox Code Playgroud)
但是,语法似乎无效.我究竟做错了什么?
>>> a = 1
>>> print { key: locals()[key] for key in ["a"] }
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
KeyError: 'a'
Run Code Online (Sandbox Code Playgroud)
如何创建一个像这样理解的字典?
我试图用以下方式创建一个包含字典理解的字典(这是一个更大的代码的一部分)
columns = ['zeta', 'Lm', 'u_mean']
print('zeta', eval('zeta'))
print(locals())
dic = {col: [eval(col)] for col in columns}
Run Code Online (Sandbox Code Playgroud)
第一个print
打印完全按照预期(变量的值zeta
)和第二个print
确认zeta
在本地字典中,但在字典解析命令python失败,出现此错误
NameError: name 'zeta' is not defined
Run Code Online (Sandbox Code Playgroud)
不幸的是,当试图重现错误以便在这里发布时,我发现我无法重现错误,因为以下命令可用于ipython
:
zeta,Lm,u_mean=1,4,69
columns=['zeta', 'Lm', 'u_mean']
print('zeta',eval('zeta'))
print(locals())
dic={ col : [eval(col)] for col in columns }
Run Code Online (Sandbox Code Playgroud)
只有我的代码中的那些命令才能工作.那么,我错过了什么吗?我可以做一些测试来看看有什么问题吗?
考虑以下字典理解:
foo = ['super capital=BLUE', 'super foo=RED']
patternMap = {x.split("=")[0]:x.split("=")[1] for x in foo}
Run Code Online (Sandbox Code Playgroud)
它相当简洁,但我不喜欢我需要打x.split('=')
两次电话的事实.我尝试了以下但它只会导致语法错误.
patternMap = {y[0] : y[1] for y in x.split('=') for x in foo}
Run Code Online (Sandbox Code Playgroud)
有没有"正确"的方法来实现前两行的结果,而不必调用x.split()
两次或更冗长?
我对lambda函数和标量有dict理解:
d = {k: lambda x : x.sum() if 'a' in k else 'yes' for k in ['bac','sss','asa']}
print (d)
{'bac': <function <dictcomp>.<lambda> at 0x00000000031891E0>,
'sss': <function <dictcomp>.<lambda> at 0x000000000D887EA0>,
'asa': <function <dictcomp>.<lambda> at 0x000000000D887B70>}
Run Code Online (Sandbox Code Playgroud)
如果需要两个标量,则可以很好地工作:
d = {k: 'no' if 'a' in k else 'yes' for k in ['bac','sss','asa']}
print (d)
{'bac': 'no', 'sss': 'yes', 'asa': 'no'}
Run Code Online (Sandbox Code Playgroud)
预期输出-标量和lambda函数的组合:
print (d)
{'bac': <function <dictcomp>.<lambda> at 0x00000000031891E0>,
'sss': 'yes',
'asa': <function <dictcomp>.<lambda> at 0x000000000D887B70>}
Run Code Online (Sandbox Code Playgroud)
怎么了?为什么不起作用?正确的方法是什么?
python lambda dictionary python-3.x dictionary-comprehension
我有两个字典:
length = {1: 3, 2: 9, 3: 1, 4: 1, 5: 0, 6: 0, 7: 5, 8: 0}
result = {1: 3.0, 2: 3.7416573867739413, 3: 7.874007874011811, 4: 6.4031242374328485, 5: 4.0, 6: 0.0, 7: 5.0, 8: 1.0}
Run Code Online (Sandbox Code Playgroud)
当键匹配时,我需要将结果值除以长度值。因此,例如:
Key = 1: 3.0 / 3
Key = 2: 3.7416573867739413 / 9
etc
Run Code Online (Sandbox Code Playgroud)
对于结果中的所有键。我尝试使用以下字典理解:
sims = {k:lengths[k] / v for k, v in result.items()}
Run Code Online (Sandbox Code Playgroud)
但是我得到一个错误 ZeroDivisionError: float division by zero
然后,我尝试避免使用难看的代码来理解,并使用:
for dot_key, dot_val in result.items():
for length_key, length_val in lengths.items():
if …
Run Code Online (Sandbox Code Playgroud) 一方面我们有
[x for x in range(10)]
{x for x in range(10)}
{x: x for x in range(10)}
另一方面我们有
(x for x in range(10))
为什么前三个表达式称为“理解”,而最后一个称为“表达式”?它们几乎以相同的方式表示,我猜它们也以非常相似的方式工作。这背后有什么微妙的原因吗?这只是为了好奇。
参考:
python terminology list-comprehension generator-expression dictionary-comprehension
我有一个像这样的列表: N = [[a,b,c],[d,e,f],[g,h,i]]
我想创建一个包含 N 中每个列表的所有第一个值的字典,以便我拥有;
d = {1:[a,d,g],2:[b,e,h],3:[c,f,i]}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多东西,但我无法弄清楚。我得到的最接近的:
d = {}
for i in range(len(N)):
count = 0
for j in N[i]:
d[count] = j
count+=1
Run Code Online (Sandbox Code Playgroud)
但这并没有给我正确的字典?我真的很感激这方面的任何指导,谢谢。
为了做到这一点,我正在生成一个字典,我将使用 dict unpacking through 将其解压为 kwargs **dict
。该字典需要包含新列名作为键和元组作为值。元组的第一个值是列名称,该列名称被压缩为一个系列,并作为 的输入提供给第二个值lambda series: ...
。
agg_dict = {
f"{cat_name}_count": ('movement_state', lambda series: series.value_counts()[cat_name])
for cat_name in ml_data['category_column'].cat.categories
}
# Aggregating
agg_ml_data = ml_data.groupby(['col1', 'col2']).agg(**agg_dict)
Run Code Online (Sandbox Code Playgroud)
现在实际发生的事情对我来说有点奇怪。
假设:
ml_data['category_column'].cat.categories
Run Code Online (Sandbox Code Playgroud)
Index(['cat1', 'cat2', 'cat3'], dtype='object')
Run Code Online (Sandbox Code Playgroud)
一组的正确值计数是
one_group['category_column'].value_counts()
Run Code Online (Sandbox Code Playgroud)
| category_column
cat1 | 2
cat2 | 9
cat3 | 6
Run Code Online (Sandbox Code Playgroud)
猫1_计数 | 猫2_计数 | 猫3_计数 |
---|---|---|
2 | 9 | 6 |
猫1_计数 | 猫2_计数 | 猫3_计数 |
---|---|---|
6 | 6 | 6 |
不知何故,python 对 lambda 函数执行的 dict 理解并不像预期的那样,并且cat3
在索引时仅使用最后一个类别值series.value_counts()[cat_name] …
我有字典列表和整数列表
x = [
{
"name": "tom",
"job": "judge"
},
{
"name":"bob",
"job": "policeman"
}
]
y = [1000, 2200]
Run Code Online (Sandbox Code Playgroud)
我想压缩它们并将y
元素添加到字典中,因为"payroll": y_element
所需的输出将是:
[
{
"name": "tom",
"job": "judge",
"payroll": 1000
},
{
"name":"bob",
"job": "policeman",
"payroll": 2200
}
]
Run Code Online (Sandbox Code Playgroud)
我实际上是通过以下方式实现的:
z = zip(x, y)
for i in z:
i[0]["payroll"] = i[1]
z = [i[0] for i in z]
Run Code Online (Sandbox Code Playgroud)
但我想知道是否可以在列表理解中的字典理解中完成。这是我到目前为止所尝试的:
z = [{k: v, "value": o} for d, o in z for k, v in d.items()]
Run Code Online (Sandbox Code Playgroud)
显然这是错误的,因为输出是: …
python ×10
dictionary ×6
lambda ×2
python-3.x ×2
list ×1
pandas ×1
syntax-error ×1
terminology ×1