1

有人可以帮我阅读这个 Python 字典元组吗?我是 python 新手,我不能从中得到太多

Grammar = {'AB':('S', 'B'), 'BB':'A', 'a':'A', 'b':'B'}

注意:语法是上下文无关语法的语法。

4

1 回答 1

1

要将字典转换为您想要的内容,您可以执行以下操作:

>>> from collection import defaultdict
>>> grammar = {'AB':('S', 'B'), 'BB':'A', 'a':'A', 'b':'B'}
>>> tmp_result = defaultdict(list)
>>> def tuplify(val):
...     if not isinstance(val, tuple):
...         val = (val,)
...     return val
... 
>>> for key, value in grammar.items():
...     values = tuplify(value)
...     for val in values:
...         tmp_result[val].append(key)
... 
>>> tmp_result
defaultdict(<type 'list'>, {'A': ['a', 'BB'], 'S': ['AB'], 'B': ['AB', 'b']})
>>> result = {key:tuple(val) for key, val in tmp_result.items()}
>>> result
{'A': ('a', 'BB'), 'S': ('AB',), 'B': ('AB', 'b')}

其中类collections.defaultdict是一个类似dict的类,它使用工厂在缺少键时创建默认值。例如写作:

>>> D = defaultdict(list)
>>> D[5].append(3)
>>> D[5]
[3]

可以使用普通dict的 s 来编写,例如:

>>> D = {}
>>> if 5 in D: # key present, use that value
...     val = D[5]
... else:      # otherwise create a default value and sets it
...     val = list()
...     D[5] = val
... 
>>> val.append(3)
>>> D[5]
[3]

传递给的“工厂”defaultdict(factory)可以是任何不接收参数的可调用对象,例如:

>>> n = 0
>>> def factory():
...     global n
...     print('Factory called!')
...     n += 1
...     return n   #returns numbers 1, 2, 3, 4, ...
... 
>>> D = defaultdict(factory)
>>> D[0]
Factory called!
1
>>> D[0]   # the keys exists, thus the factory is not called.
1
>>> D[1]
Factory called!
2
>>> D[1]
2
于 2013-04-07T08:23:39.157 回答