python - 在python3中理解循环字典到熊猫的一行
问题描述
我已经阅读了几个关于此的 StackOverflow 主题以及 Google。这不是我的代码。它是为 Python2 编写的。我试图理解 Python 3 中给出和错误的一行。我很难将我的头绕在这一行 for 循环上。
para['row_colors'] = pd.DataFrame([dict({'index': row}.items() + row_colors[row].items()) for row in table.index]).set_index('index')'
'row' 是用作键的示例名称。我明白了。那个'+'正在抛出错误。不能做 dict.item + dict.item。我不明白正在构建的字典的结构。
解决方案
是的,因为dict.items()
在 Python 3 中不再返回列表,而是返回一个特殊对象,该对象充当字典中项目的类似集合的视图(与.keys
and相同.values
)。最简单的解决方法就是简单地做list(dict.items())
.
但是,在这种特殊情况下,dict({'index': row}.items() + row_colors[row].items())
可能应该只是{'index':row, **row_colors[row]}
在 python 3 中。
所以你可以使用:
para['row_colors'] = pd.DataFrame([{'index': row, **row_colors[row]} for row in table.index]).set_index('index')'
使用更现代的语法。
要了解以前的版本在做什么,请注意dict
构造函数接受一个可迭代的键值对:
>>> dict([('a', 1), ('b', 2)])
{'a': 1, 'b': 2}
由于.items()
用于返回键值对列表,因此您可以执行类似的操作
dict(d1.items() + d2.items())
合并两个字典。要将其音译为 Python 3,您需要类似以下内容:
>>> d1 = {'foo': 'bar', 'baz': 'zing'}
>>> d2 = {"apple": 42}
>>> dict(list(d1.items()) + list(d2.items()))
{'foo': 'bar', 'baz': 'zing', 'apple': 42}
但是 python 3 有更方便的语法,你可以这样做:
>>> {**d1, **d2}
{'foo': 'bar', 'baz': 'zing', 'apple': 42}
或者,更灵活地使用特定的键值对:
>>> {'index': 'column1', **d1, 'frob': 'bob', **d2}
{'index': 'column1', 'foo': 'bar', 'baz': 'zing', 'frob': 'bob', 'apple': 42}
最后,请注意 Python 3.9将添加|
操作符作为 dicts 的合并操作符,允许非常简洁:
>>> d1 | d2
{'foo': 'bar', 'baz': 'zing', 'apple': 42}
对于最简单的情况
推荐阅读
- javascript - 如何在 Jest 的 xyz.test.js 中导入“.mjs”模块?
- java - JUNITS:MockRestServiceServer 未使用 Maven 构建运行
- java - 为可执行 JAR 文件提供外部依赖项
- android - 当我想使用 Android Studio 生成应用程序包时出错:需要更新 Gradle
- python - 根据 Pandas 中其他列中的值计算列值
- c++ - llvm IR 中的内联函数
- python - Pandas 在 DataFrame 中途移动列
- python - Python - Discord.py - 我的 Cog 的 wait_for() 意外关键字
- r - filter a dataframe by a column of another data frame
- ios - React native 不是公认的客观 C 方法