使用先前创建的编号变量运行单个for循环

时间:2019-03-07 09:19:52

标签: python

我正在分析文件类型为AnnData.h5ad文件。

我已经基于某些群集程序创建了单独的列表,并根据它们的群集编号(即x1x2x3x4来命名列表。 ..)

现在,我想取每个列表中所有单独行的均值。当然,可以通过创建多个循环来轻松完成此操作,但是我认为尝试在单个循环中执行此操作会很有趣。

针对单个列表执行此操作的代码如下:

means1 = []
for q in range(0, len(x1.var)):
    means1.append(np.mean(x1.X[:, q2])

现在,我希望能够用可变数字代替means1x1。 对于means1,可以通过将其设为字典并与for一起使用第二个range(0, number)来解决,如下所示:

x = {}
for q1 in range(0, 20):
    for q2 in range(0, len(x1.var)):
        x['mean' + q1] = np.mean(x1.X[:,q2])

但是因为我在x1中使用的变量已经存在,所以不可能仅使用'x' + q1这样的字符串格式,因为str没有属性{{1 }}。

有没有办法做到这一点,或者我应该接受那是不可能的吗?

3 个答案:

答案 0 :(得分:2)

  

我已经基于某些群集程序创建了单独的列表,并根据它们的群集编号(即x1,x2,x3,x4 ..)来命名列表

通常,当您发现自己使用这种命名方案时,您确实希望使用列表或字典。

答案 1 :(得分:1)

第一个主意:您可以在外部循环中遍历所有列表,然后将第二个主意应用于此。然后为x中的每个列表创建一个下标。这样,您将拥有3个用于所有内容的循环,而不是每个列表一个:

x = {}
list_number = 1
for list in x1, x2, x3, x4:
    for q1 in range(0, 20):
        for q2 in range(0, len(list.var)):
            x['x{}'.format(list_number)]['mean' + str(q1)] = np.mean(list.X[:,q2])
    list_number += 1

我们也可以用dict理解替换循环(实际上并没有消除循环,而是缩短了代码):

x['x{}'.format(list_number)] = {'mean'+str(q1): np.mean(list.X[:,q2]) for q2 in range(0, len(list.var))}

话虽这么说,但我不知道确切的数据结构,但有格式

lists = {'x1': [the_list], 'x2': [other_list], ...}

对于此类任务总是更好。由于没有真正好的方法来get the name of a variable,因此将它们存储在字典中作为字符串键可以更轻松地使用它们。这使您可以执行以下操作:

means = {name: {'mean'+ str(q + 1): np.mean(lists[name].X[:,q]) for q in range(len(lists[name].var))} for name in lists}

将返回以下形式的字典

means = {'x1': {'mean1': mean_1, 'mean2': mean_2, ...}, 'x2': {'mean1': mean_1,...}...}

不可能用一个循环来完成所有这些操作,至少就现在的数据结构而言是不可能的,因为您必须迭代至少两个可迭代对象:

  1. 所有列表;

  2. 每个元素的所有元素都列出了变量。

答案 2 :(得分:0)

一种简单的解决方案是用所有df = pd.concat([ df.select_dtypes([], ['object']), df.select_dtypes(['object']).apply(pd.Categorical, ordered=True) ], axis=1).reindex(df.columns, axis=1) 变量构建一个列表,然后对其进行迭代。

也许是这样的:

x

这对您有用吗?