从变量列表中提取变量名称

时间:2017-12-05 01:17:29

标签: python python-3.x

考虑两个系列,它们是类实例xyz的属性,以及包含它们的列表:

为了再现问题,想象s1和s2是:

s1 = pd.Series(np.random.rand(10))
s2 = pd.Series(np.random.rand(10))

list= [xyz.s1, xyz.s2]

鉴于列表,我如何提取系列'名字' s1'和' s2'?

我尝试过类似的事情:

series_names = [str(x) for x in list]

但它没有用;它试图转换系列'值为字符串,而不是系列'名。

此外,

series_names = [x.name for x in list]

导致:

series_names = ['xyz', 'xyz']

期望的输出:

series_names = ['s1', 's2']

2 个答案:

答案 0 :(得分:1)

如果您因某种原因确实想保留名称,请将数据保存在字典而不是列表中。

series = {
    's1': pd.Series(np.random.rand(10)),
    's2': pd.Series(np.random.rand(10))
}

series_names = [x for x in series] # ['s1', 's2']

答案 1 :(得分:0)

您可以使用globals功能执行某些操作:

>>> s1 = 'a'
>>> s2 = 'b'
>>> globals()
{..., 's1': 'a', 's2': 'b'}

所以你可以这样做:

def extract_name(value):
    for k, v in globals().items():
        if v is value:
            yield k

这会生成一个生成器,因此如果两个变量引用同一个对象,它会捕获所有可能的名称:

>>> class A: pass
>>> a = A()
>>> b = a
>>> list(extract_name(a))
['a', 'b']

所以,你可以这样做:

>>> l = [s1, s2]
>>> [next(extract_name(v)) for v in l]
['s1', 's2']

(使用next是从生成器中取出名称。)