我不知道用什么确切的词来更科学地表达这个句子,所以请随时帮助我解决我糟糕的语法问题。
我的问题如下:我用字典列表构造了一个表,如下所示:
for d in listDictionary:
print d
{'key1':'value11', 'key2':'value12', ..., 'keyM':'value1M'}
{'key1':'value21', 'key2':'value22', ..., 'keyM':'value2M'}
...
{'key1':'valueN1', 'key2':'valueN2', ..., 'keyM':'valueNM'}
为了简单起见,你可以把它想象成一个N*M
矩阵。像这样:
key1 key2 ... keyM
value11 value12 ... value1M
value21 value22 ... value2M
...
valueN1 valueN2 ... valueNM
现在,这是真正的问题。其中一些值需要进一步处理,但并不总是清楚还要处理多少。例如,我们从keyK中选择Ith
的值。0<K<M, 0<I<N
因此我们有valueIK
。
valueIK
将表示n/a
或表示siblings
和children
的树。
树的表示是这样的:
root1
-> somevalue1
root2
-> somevalue2
root3
-> somevalue3
那么在纯文本中,valueIK
将是:root1>somevalue1;root2>somevalue2;root3>somevalue3;
我希望能够扩展矩阵/listDictionary,因为valueIK拥有比初始假设更多的项。但是为了在字典中保持一个恒定的大小,列表中的其他条目也必须被更新。
交货。如果我们把这个作为初始矩阵
key1 key2 ... keyK ... keyM
value11 value12 ... ... value1M
value21 value22 ... ... value2M
... valueIK
valueN1 valueN2 ... ... valueNM
我想完成这样的事情:
key1 key2 ... keyK root1 root2 ... keyM
value11 value12 ... n/a whatevervalue ... value1M
value21 value22 ... someothervalue n/a ... value2M
... valueIK somevalue1 n/a
valueN1 valueN2 ... n/a helloWorld ... valueNM
换句话说,其余的项可能在root_
键下有一些值,我们不希望改变它们,但如果它们没有值,我们必须用'n/a'
填充矩阵单元格
很抱歉,这是一个很长的和技术性的帖子。我试着尽可能地分析。我一个人想不出办法来,所以我来寻求帮助。
谢谢:)
首先,简单的答案:
如果你只想设置未设置的值,有一个dict.setdefault
方法。例如,给定dict5
作为第五行(包含value51
、value52
等),并且想要更新列root1
:
# returns the value of dict5['root1'], setting it to 'n/a' if it didn't exist at all
dict5.setdefault('root1', 'n/a')
然而,注意:由于您是根据字典为每一行构建表,因此在大多数情况下,您实际上不需要将未使用的内容设置为'n/a'
—您可以安全地保留一个字典的元素不设置,并设置另一个字典中的内容,因为没有字典实际上相互检查。这将节省内存,并且您不需要花时间设置所有的空。只要确保当你把东西拿出来时,你使用get
而不是[]
,例如:
# Returns dict5['root1'], but returns 'n/a' if that doesn't exist.
dict5.get('root1', 'n/a')
如果你这样做,你将不得不在某个地方保留一个单独的列表,并循环遍历所有列,如果你之前以某种方式循环遍历每个字典,例如:
# Prints each cell of the table on a new line, including 'n/a' for empty cells
columns = ['key1', 'key2', 'key3']
for d in listDictionary:
for c in columns:
print d.get(c, 'n/a')
# Instead of:
for d in listDictionary:
for c in d: # Only gets the keys that exist in that particular dict, so no 'n/a's
print d.get[c]
如果我正确理解了这个问题,也许这可以工作:
data = [
{ 'k1': 'root3>rv11;root1>rv12', 'k2': 'v12', 'k3': 'v13'},
{ 'k1': 'v21', 'k2': 'root1>rv21;root2>rv22;', 'k3': 'v23'},
{ 'k1': 'v31', 'k2': 'v32', 'k3': 'root2>rv32;'}
]
newkeys = set()
for item in data:
add = {}
for k, v in item.items():
if '>' in v:
fields = v.strip(';').split(';')
add.update(dict(f.split('>') for f in fields))
newkeys |= set(add.keys())
item.update(add)
for nk in newkeys:
for item in data:
if nk not in item:
item[nk] = None
print(data)