避免在使用多个python列表时使用'i'进行索引

避免在使用多个python列表时使用'i'进行索引,python,pandas,numpy,Python,Pandas,Numpy,下面是在生成一些合成数据时出现的 示例代码: 将numpy导入为np def示例( *, n_vars=4, n=10, flag_1=真, flag_2=真, flag_3=真, ): 数据={} 如果标志_1: 刻度=[2用于范围(n)] 其他: 刻度=[np.random.randint(0,10)表示范围(n)] 如果标志_2: locs=[2用于范围内(n)] 其他: locs=[np.random.randint(0,10)表示范围(n)] 对于范围内的i(n_变量): 数据[f“v

下面是在生成一些合成数据时出现的

示例代码:

将numpy导入为np
def示例(
*,
n_vars=4,
n=10,
flag_1=真,
flag_2=真,
flag_3=真,
):
数据={}
如果标志_1:
刻度=[2用于范围(n)]
其他:
刻度=[np.random.randint(0,10)表示范围(n)]
如果标志_2:
locs=[2用于范围内(n)]
其他:
locs=[np.random.randint(0,10)表示范围(n)]
对于范围内的i(n_变量):
数据[f“var{i}]=np.random.normal(loc=locs[i],scale=scales[i],size=n)
返回pd.DataFrame(数据)
我不确定的是如何使用多个列表中的值以及计数器。在循环中使用
locs[i]
感觉很不自然(至少在python中是这样)。但是使用类似于
enumerate(some_list)
的方法在这里不起作用(因为我有多个列表),而
zip(list1,list2)
也不起作用,因为我需要计数器

类似于
enumerate(zip(list_1,list_2))
的东西可以在每次迭代中提供一个计数器和一个元组,尽管如果我有三个列表,感觉它也会崩溃

以下是另一种方法:

将numpy导入为np
def示例2(
*,
n_vars=4,
n=6,
flag_loc=真,
flag_scale=True,
):
数据={}
np.随机种子(1)
#为loc/scale构建阵列
random_data=np.random.randint(0,10,size=(n_变量,2))
随机数据[:,0]=随机数据[:,0]*int(标志位置)+int(非标志位置)*2
随机数据[:,1]=随机数据[:,1]*int(标志刻度)+int(非标志刻度)*2
随机数据=pd.DataFrame(
{
“locs”:np.random.randint(0,10,size=(n_变量))
如果旗标锁定
else[2]*n_vars,
“尺度”:np.random.randint(0,10,size=(n_变量))
如果旗标
else[2]*n_vars,
}
)
对于随机_数据中的i,r.ItErrors():
数据[f“x{i}”]=np.random.normal(loc=r[“locs”],scale=r[“scales”],size=n)
返回pd.DataFrame(数据)
返回

          x0         x1        x2        x3
0   5.559480  11.236594  5.726233  4.749504
1  10.261197   9.111226  8.827740  3.053234
2   9.386170   9.753313 -1.567655  3.090958
3   5.465608   9.752270  8.942386  3.829324
4   9.626370   8.671618 -0.524433  7.006377
5  10.674446   8.830913 -1.629373  6.321282
这也许是一个更好的,但仍然觉得它缺乏

解决方案 我理解可能存在一些主观性——但我确实觉得python中有一种比我所写的更好的方法。我很高兴有一个解决方案可以使用基本python,或者包含numpy/pandas。

您可以使用
zip()
一次循环浏览多个列表,还可以更深入地使用列表理解

import numpy as np
import pandas as pd

def example(*, n_vars=4, n=10, flag_1=True, flag_2=True, flag_3=True):
    data = {}

    scales = [2 if flag_1 else np.random.randint(0, 10) for _ in range(n)]
    locs = [2 if flag_2 else np.random.randint(0, 10) for _ in range(n)]

    data = {f"var_{i}": np.random.normal(loc=loc, scale=scale, size=n) for i, loc, scale in zip(range(n_vars), locs, scales)}

    return pd.DataFrame(data)

print(example())

我也用一些很好的听写理解更新了我的答案:)