如何解析具有不同键值数量的元组列表

Posted

技术标签:

【中文标题】如何解析具有不同键值数量的元组列表【英文标题】:How to Parse a list of tuples with different number of key values 【发布时间】:2022-01-12 17:57:17 【问题描述】:

我有一个这样的tuples 列表。

('change', ['System.Rev', 'newValue'], (1, 2))
('add', ['System.Rev'], [('oldValue', 1)])
('change', ['System.AuthorizedDate', 'newValue'], ('2021-10-27T11:10:45.047Z', '2021-10-27T11:10:45.77Z'))
('add', ['System.AuthorizedDate'], [('oldValue', '2021-10-27T11:10:45.047Z')])
('change', ['System.RevisedDate', 'newValue'], ('2021-10-27T11:10:45.77Z', '9999-01-01T00:00:00Z'))
('add', ['System.RevisedDate'], [('oldValue', '2021-10-27T11:10:45.77Z')])
('change', ['System.ChangedDate', 'newValue'], ('2021-10-27T11:10:45.047Z', '2021-10-27T11:10:45.77Z'))
('add', ['System.ChangedDate'], [('oldValue', '2021-10-27T11:10:45.047Z')])
('change', ['System.Watermark', 'newValue'], (249, 250))
('add', ['System.Watermark'], [('oldValue', 249)])
('add', '', [('Microsoft.VSTS.Common.BacklogPriority', 'newValue': 599975506.0)])

有没有办法将它转换成字典或其他方式来解析它,以便我可以获得 addchange 值?

预期输出

changeSystem.RevnewValue2

addMicrosoft.VSTS.Common.BacklogPrioritynewValue': 599975506.0 或类似的东西,可以以干净的格式显示添加和更改的值以发送到 db 列。

这就是我得到这个的方式

from dictdiffer import diff

for i, j in enumerate(rev_items):
    try:
        res = list(diff(rev_items[i], rev_items[i+1]))
        for item in res:
            print(item)

当我执行dict(res) 时,它什么也不打印。

我尝试过的一种方法是这样。 不使用列表理解

for item in res:
    for c in range(len(item)):
        print(item[c])

输出这个

change
['System.Rev', 'newValue']
(1, 2)
add
['System.Rev']
[('oldValue', 1)]
change
['System.AuthorizedDate', 'newValue']
('2021-10-27T11:10:45.047Z', '2021-10-27T11:10:45.77Z')
add
['System.AuthorizedDate']
[('oldValue', '2021-10-27T11:10:45.047Z')]
change
['System.RevisedDate', 'newValue']
('2021-10-27T11:10:45.77Z', '9999-01-01T00:00:00Z')
add
['System.RevisedDate']
[('oldValue', '2021-10-27T11:10:45.77Z')]
change
['System.ChangedDate', 'newValue']
('2021-10-27T11:10:45.047Z', '2021-10-27T11:10:45.77Z')
add
['System.ChangedDate']
[('oldValue', '2021-10-27T11:10:45.047Z')]
change
['System.Watermark', 'newValue']
(249, 250)
add
['System.Watermark']
[('oldValue', 249)]
add

[('Microsoft.VSTS.Common.BacklogPriority', 'newValue': 599975506.0)]

如何从中获取/解析 addchange 值?

【问题讨论】:

我没有投票,但这不是元组列表。 [...] 中包含一个列表 目前尚不清楚您的预期输出与输入之间的关系。为什么新值只有2,而不是(1, 2) 什么是revs?为什么不只是for value in response['value']: rev_items[i+1] 将在最后一次迭代中出错。 什么是diff()? pandas 和 numpy 中有一个diff() 方法,但它不是标准的 Python 函数。 【参考方案1】:

感谢Barmar 的输入。我就是这样得到的。

res = list(diff(rev_items[i], rev_items[i+1]))
for item in res:
    for a, b in enumerate(item):
        if item[a] == 'change' or item[a] == 'add':
            print(item[a+1], ":", item[a+2])

输出

['System.Rev', 'newValue'] : (1, 2)
['System.Rev'] : [('oldValue', 1)]
['System.AuthorizedDate', 'newValue'] : ('2021-10-27T11:10:45.047Z', '2021-10-27T11:10:45.77Z')
['System.AuthorizedDate'] : [('oldValue', '2021-10-27T11:10:45.047Z')]
['System.RevisedDate', 'newValue'] : ('2021-10-27T11:10:45.77Z', '9999-01-01T00:00:00Z')
['System.RevisedDate'] : [('oldValue', '2021-10-27T11:10:45.77Z')]
['System.ChangedDate', 'newValue'] : ('2021-10-27T11:10:45.047Z', '2021-10-27T11:10:45.77Z')
['System.ChangedDate'] : [('oldValue', '2021-10-27T11:10:45.047Z')]
['System.Watermark', 'newValue'] : (249, 250)
['System.Watermark'] : [('oldValue', 249)]
 : [('Microsoft.VSTS.Common.BacklogPriority', 'newValue': 599975506.0)]

【讨论】:

以上是关于如何解析具有不同键值数量的元组列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有子元组的元组创建列表?

python学习之第五篇:Python中的元组及其所具有的方法

将元组列表的字典转换为数据框

Python中dict的元组列表[重复]

Python中的元组(Tuple)

从元组列表中返回具有最小 y 值的元组