Python:从lis检索字典名

2024-04-26 14:12:54 发布

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

我有一个字典列表,我想从循环中检索它们的名称,例如:

for d in list_dicts:
    print d.name

list_dicts = [dic1, dic2]
d.name = dic1

可能吗?怎么可能?谢谢


Tags: namein名称列表for字典listprint
3条回答

dic1dic2是变量名。它们毫无意义。事实上,你可以做到:

dic1 = {1:2, 3:4}
dic2 = dic1
list_dicts = [dic1, dic2]

这里的列表包含了对同一本词典的两个引用!你知道吗

如果您真的需要一个名称,您可以简单地将其添加到字典中(有点老套,但只要键是唯一的,就应该可以工作):

dic1['name'] = 'dic1'

您可以将它们都包装在一个类中:

class NamedDct(object):
    def __init__(self, dct, name):
        self.dct = dct
        self.name = name
dic1 = NamedDct(dic1, 'dic1')

或者您可以从dict继承(请注意,这是一个退化的示例,不深入细节):

class NamedDct(dict):
    def __init__(self, name):
        self.name = name
        super(NamedDct, self).__init__()
dic1_new = NamedDct('dic1')
dic1_new.update(dic1)

您可能需要使用namedtuple来表示类似的内容。你知道吗

命名元组允许构造轻量级名称/数据组合(以元组的Python子类的形式),非常适合这种用例。你知道吗

假设我们想要一个附在名字上的dict。你知道吗

(使用verbose=True打印整个类以供检查。正常使用时,不包括……)

>>> from collections import namedtuple
>>> NamedDict = namedtuple('NamedDict', 'name data', verbose=True)
class NamedDict(tuple):
    'NamedDict(name, data)'

    __slots__ = ()

    _fields = ('name', 'data')

    def __new__(_cls, name, data):
        'Create new instance of NamedDict(name, data)'
        return _tuple.__new__(_cls, (name, data))

    @classmethod
    def _make(cls, iterable, new=tuple.__new__, len=len):
        'Make a new NamedDict object from a sequence or iterable'
        result = new(cls, iterable)
        if len(result) != 2:
            raise TypeError('Expected 2 arguments, got %d' % len(result))
        return result

    def __repr__(self):
        'Return a nicely formatted representation string'
        return 'NamedDict(name=%r, data=%r)' % self

    def _asdict(self):
        'Return a new OrderedDict which maps field names to their values'
        return OrderedDict(zip(self._fields, self))

    def _replace(_self, **kwds):
        'Return a new NamedDict object replacing specified fields with new values'
        result = _self._make(map(kwds.pop, ('name', 'data'), _self))
        if kwds:
            raise ValueError('Got unexpected field names: %r' % kwds.keys())
        return result

    def __getnewargs__(self):
        'Return self as a plain tuple.  Used by copy and pickle.'
        return tuple(self)

    __dict__ = _property(_asdict)

    def __getstate__(self):
        'Exclude the OrderedDict from pickling'
        pass

    name = _property(_itemgetter(0), doc='Alias for field number 0')

    data = _property(_itemgetter(1), doc='Alias for field number 1')

考虑

>>> nd=NamedDict('dict1', {1:'one', 2:'two'})
>>> nd
NamedDict(name='dict1', data={1: 'one', 2: 'two'})
>>> nd.name
'dict1'
>>> nd.data
{1: 'one', 2: 'two'}

因此,您可以将一个名称和dict与列表中的每一对相关联:

LoT=[
   ('dict1', {1:'one', 2:'two'}),
   ('dict2', {3:'three', 4:'four'})
   ]

NamedDict = namedtuple('NamedDict', 'name data')

LoND=[NamedDict(*t) for t in LoT]

for d in LoND:
    print(d.name, d.data)

印刷品:

dict1 {1: 'one', 2: 'two'}
dict2 {3: 'three', 4: 'four'}

假设你有这样一个字典列表:

dic1:{“名称”:“名称1”,…} dic2:{“名称”:“名称2”,…}

还有这样的清单: 列表dicts=[dic1,dic2]

访问字典字段的方法是文字表示法(带括号)。你知道吗

for d in list_dicts:
    print d["name"]

相关问题 更多 >