增加字典列表中的列数



我不知道用什么确切的词来更科学地表达这个句子,所以请随时帮助我解决我糟糕的语法问题。

我的问题如下:我用字典列表构造了一个表,如下所示:

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或表示siblingschildren的树。

树的表示是这样的:

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作为第五行(包含value51value52等),并且想要更新列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)

最新更新