【问题标题】:print index name in python在python中打印索引名称
【发布时间】:2016-01-07 13:28:24
【问题描述】:

我想知道如何输出列表和子列表中每个索引(和子索引)的名称,而不是值。

例如,假设我有一个主列表,其中有 3 个其他列表,每个列表包含 5 个子列表。这是一个需要澄清的小例子:

List1 = [SubList1, SubList2, SubList3, SubList4, SubList5]
List2 = [Apple, Banana, Orange, Pear, Grape]
List3 = [Red, Yellow, Orange, Green, Purple]


Lists = [List1, List2, List3]

MainList = [Lists]

如何打印出“List1”?

当我输入时

MainList[0][0]

输出

[SubList1, SubList2, ..., Sublist5]

我想要索引的实际名称,而不是它的值。

我考虑过使用字典键,但我用于 XML 转换的报告生成器将所有数据输出到列表中。这是否意味着我别无选择,只能修改我的报告生成器脚本以将数据输出到字典中?

【问题讨论】:

  • 尝试使用dict(),因为它是关键:基于值的集合
  • 你不能,这个名字不是那样的。这是一个标签,而不是一个属性。推荐阅读:nedbatchelder.com/text/names.html
  • list 索引没有名称,但字典中的key 确实有名称,使用它。

标签: python list indexing


【解决方案1】:

尝试为此使用dict()

List1 = ['SubList1', 'SubList2', 'SubList3', 'SubList4', 'SubList5']
List2 = ['Apple', 'Banana', 'Orange', 'Pear', 'Grape']
List3 = ['Red', 'Yellow', 'Orange', 'Green', 'Purple']


xd = {'List1': List1, 'List2': List2, 'List3': List3}

print xd['List1']

for k, v in xd.iteritems():
    if v == List1:
        print k

>>> ['SubList1', 'SubList2', 'SubList3', 'SubList4', 'SubList5']
>>> List1

【讨论】:

  • 谢谢,我尝试了你的建议,但收到以下错误:AttributeError: 'dict' object has no attribute 'iteritems' 我正在使用 Python 3.4 顺便说一句
  • 找到了我的问题的答案:stackoverflow.com/questions/30418481/…
  • @MikeIssa 是的。在 Python 3 中你不需要 iteritems()。它默认是生成器。只需使用items()
  • 很遗憾,这是O(n) 解决方案。
【解决方案2】:

你好像误会了。您的示例中的 List1 是一个变量名。它不存储在 Lists 数组中,只存储它的值。因此,您不会将 List1 从 Lists 中取出。数组索引是整数,Lists 中 List1 的索引为 0。正如其他评论者建议的那样,您可能希望将 Lists 结构转换为 dict。

列表 = {} 列表['List1'] = [SubList1, SubList2, SubList3, SubList4, SubList5] Lists['List2'] = [苹果、香蕉、橙子、梨、葡萄] 列表['List3'] = [红、黄、橙、绿、紫] 打印(列表.keys())

【讨论】:

    【解决方案3】:

    快速解决方案:

    class NamedList(list):
        __slots__ = ['__name__'] # optimisation, can be ommited
        def __init__(self, name, *args):
            super().__init__(*args)
            self.__name__ = name
        def __repr__(self):
            return "%s(%r, %s)" % (type(self).__name__, self.__name__, super().__repr__())
    
    test = NamedList('test', [1, 2, 3])
    print(test)
    print(test.__name__)
    

    输出:

    NamedList('test', [1, 2, 3])
    test
    

    【讨论】:

      【解决方案4】:

      list 对象没有 name 属性,你应该使用 pandas.Series 如下:

      import pandas as pds
      List1 = pds.Series([SubList1, SubList2, SubList3, SubList4, SubList5],name='List1')
      List2 = pds.Series([Apple, Banana, Orange, Pear, Grape],name='List2')
      

      你会发现这样的名字:

      print List1.name,List2.name
      

      一个列表变成一个pandas.DataFrame:

      Lists = pds.DataFrame([List1, List2, List3])
      

      要回答您的问题,您应该按照以下步骤进行:

      -每个子列表变成一个系列

      Sublist = pds.Series([...],name='Sublist')
      

      -每个列表变成一个数据框:

      List = pds.DataFrame([Sublist1,Sublist2,..])
      

      -"the" 列表变成字典:

      Lists = {'List1' : List1,
               'List2' : List2,
               ...
               }
      

      -你得到名字:

      for name_list,list in Lists.items(): 
           name_list,list.columns
      

      【讨论】:

      • 请添加一些示例代码来展示它是如何解决问题的。
      【解决方案5】:

      如果您的列表始终存储为变量,您可以使用某种身份字典检索它们的名称(遗憾的是标准库中没有):

      names = IdentityWeakKeyDict((obj, name for name, obj in locals().items()))
      

      names 现在应该将对象映射到它们的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-12
        • 2019-06-18
        • 2013-12-16
        • 1970-01-01
        • 2020-07-21
        • 2021-12-08
        • 1970-01-01
        相关资源
        最近更新 更多