我不知道用更科学的方式说出这些词语的确切词语,所以请随意用我糟糕的语法来帮助我。
我的问题如下:我已经从字典列表中构建了一个表格,如下所示:
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;
我希望能够扩展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'
很抱歉这篇文章非常长,技术性很强。我试着尽可能地分析。 我无法找到自己做到这一点的方法,这就是我寻求帮助的原因。
谢谢:)
答案 0 :(得分:0)
首先,简单的答案是:
如果您只想设置未设置值,则可以使用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')
如果你这样做,你将不得不在某个地方保留一个单独的列列表并循环显示,如果你之前以某种方式循环遍历每个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)