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

2024-10-02 18:19:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在分析一个.h5ad文件,它的文件类型是^{}。你知道吗

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

现在,我想取每个列表中所有单独行的平均值。当然,这可以很容易地做许多循环,但我认为这将是有趣的尝试,并在一个单一的循环。你知道吗

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

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

现在,我想用变量数替换means1x1。 对于means1,这可以通过使其成为dict并使用第二个forrange(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没有属性.X。你知道吗

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


Tags: 文件in列表forlenvarnp集群
3条回答

第一个想法:你可以在一个外循环中迭代你的所有列表,并将你的第二个想法应用到这个上面。然后为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))}

也就是说,虽然我不知道你的数据是如何构造的,但是有一个dict的形式

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

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

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,...}...}

用一个循环来完成所有这些都是不可能的,至少就目前的数据结构而言是不可能的,因为您必须迭代至少两个iterable:

  1. 所有列表;

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

一个简单的解决方案是构建一个包含所有x变量的列表,然后对其进行迭代。你知道吗

可能是这样的:

x_list = [x1, x2, x3, x4]
means = {}

for i, x in enumerate(x_list):
    for j in range(len(x.var)):
        key = (i, j)
        means[key] = np.mean(x.X[:, j])

这对你有用吗?你知道吗

I've created separate lists based on some clustering program, and named the lists according to their cluster number (i.e. x1, x2, x3, x4 ..)

大多数情况下,当你发现自己在使用这样的命名方案时,你真的需要一个列表或dict来代替。你知道吗

相关问题 更多 >