增加词典列表中的列数

时间:2016-09-12 16:48:54

标签: python dictionary

我不知道用更科学的方式说出这些词语的确切词语,所以请随意用我糟糕的语法来帮助我。

我的问题如下:我已经从字典列表中构建了一个表格,如下所示:

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; 我希望能够扩展matrix / 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'

填充矩阵单元格

很抱歉这篇文章非常长,技术性很强。我试着尽可能地分析。 我无法找到自己做到这一点的方法,这就是我寻求帮助的原因。

谢谢:)

2 个答案:

答案 0 :(得分:0)

首先,简单的答案是:

如果您只想设置未设置值,则可以使用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')

如果你这样做,你将不得不在某个地方保留一个单独的列列表并循环显示,如果你之前以某种方式循环遍历每个dict,例如:

# 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]

答案 1 :(得分:0)

如果我能正确理解这个问题,也许这可能有用:

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)