繁体   English   中英

列表理解可以分为两个列表吗?

[英]Can a list comprehension be divided in two lists?

我想我已经理解了单行 for 循环的想法,但现在我遇到了问题。 我知道我可以使用如下定义一个 dataframe 列:

df = pd.DataFrame(columns=["columnA"])

list = [0, 1, 2, 3, 4]

df["columnA"] = [i for i in list]

现在我的问题是:是否可以在一行 for 循环中定义 2 列?

我试过这个:

df["columnA"], df["columnB"] = [i, i**2 for i in list]
df["columnA"], df["columnB"] = [[i, i**2] for i in list]

这些都不起作用。 我正在使用 Python 3.10

您必须zip您的 output:

df['A'], df['B'] = zip(*[(i, i**2) for i in lst])
print(df)

# Output
   A   B
0  0   0
1  1   1
2  2   4
3  3   9
4  4  16

您还可以使用np.array

df[['A', 'B']] = np.array([(i, i**2) for i in lst])

现在您的代码正在覆盖 A 列中的内容。

df["columnB"], df['columnA'] = [i**2 for i in list], [i for i in list]

上面的答案比我的好多了。 今天学到了新东西。

这是我对您的问题的解决方案:

1:栏目创建

使用 dataframe 创建列,这比以后添加列快得多

list = [0, 1, 2, 3, 4]
df = pd.DataFrame({
    "columnA":list,
    "columnB":[i**2 for i in list]
})

通过使用%%timeit对其进行测试,我们获得:

161 µs ± 4.41 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

现在,让我们检查您的版本:

df = pd.DataFrame(columns=["columnA"])

list = [0, 1, 2, 3, 4]

df["columnA"] = [i for i in list]
df["columnB"] = [i**2 for i in list]

1.58 ms ± 72.3 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

您的版本或多或少了 10000 倍。

2:使用.assign

如果在创建 dataframe 时无法创建所有列,则可以使用 .assign 通过单个方法创建多个列:

df = pd.DataFrame({
    "columnA" :[i for i in list]
}).assign(
    columnB = [i**2 for i in list],
    columnC = [i**3 for i in list]
)

3:单为

如果你真的想使用单个for,你可以先构建数据,然后构建dataframe:

data = [
    {
        "columnA":i,
        "columnB":i**2
    } for i in list
]
df = pd.DataFrame(data)

最后, list已经是 python 关键字,所以你应该避免覆盖它。 您将无法访问实际的 function 和类型,因此这些将不起作用:

list(iter([1,2,3])) (将可互操作的对象转换为列表)

isinstance([1,2,3],list) (检查变量是否为列表类型)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM