标签: dictionary-comprehension

使用dict理解的语法无效

给定一个名为'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)

但是,语法似乎无效.我究竟做错了什么?

python syntax-error dictionary-comprehension

5
推荐指数
1
解决办法
2914
查看次数

使用locals()的Python字典理解给出了KeyError

>>> 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)

如何创建一个像这样理解的字典?

python dictionary dictionary-comprehension

4
推荐指数
1
解决办法
1193
查看次数

使用字典理解和eval()创建一个dict给了我NameError

我试图用以下方式创建一个包含字典理解的字典(这是一个更大的代码的一部分)

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)

只有我的代码中的那些命令才能工作.那么,我错过了什么吗?我可以做一些测试来看看有什么问题吗?

python dictionary dictionary-comprehension

4
推荐指数
1
解决办法
332
查看次数

是否可以从未解析的字符串列表构建字典理解而不进行双重拆分?

考虑以下字典理解:

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()两次或更冗长?

python dictionary dictionary-comprehension

4
推荐指数
1
解决办法
89
查看次数

带Lambda函数和标量的Dict理解

我对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

4
推荐指数
1
解决办法
195
查看次数

如何处理字典理解中的异常

我有两个字典:

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)

python dictionary python-3.x dictionary-comprehension

4
推荐指数
1
解决办法
115
查看次数

为什么生成器表达式这么叫?

一方面我们有

  • 列表理解 [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

4
推荐指数
1
解决办法
81
查看次数

如何在python中填充字典?

我有一个像这样的列表: 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)

但这并没有给我正确的字典?我真的很感激这方面的任何指导,谢谢。

python dictionary dictionary-comprehension

4
推荐指数
1
解决办法
265
查看次数

python 字典理解如何与内部的 lambda 函数一起工作

我的目标是使用agg函数聚合 pandas DataFrameGroupBy 对象。

为了做到这一点,我正在生成一个字典,我将使用 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] …

python lambda pandas dictionary-comprehension

4
推荐指数
1
解决办法
832
查看次数

Python 字典理解将字典和整数的元组列表转换为字典列表

我有字典列表和整数列表

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 list dictionary-comprehension

4
推荐指数
1
解决办法
192
查看次数