我有一个字典词典,结构如下:
1:{'Amendment': '1',
'status': 'Stadf\xc3\xa6stet',
'Name': 'Bodil Kornbek',
'title': 'L 1 Forslag til till\xc3\xa6gsbevillingslov for 2004.',
'fremsat': '2005-03-04',
'Vote.Numeric': '2',
'PSession': '1',
'vedtaget': '2005-04-12',
'Lsession': '3',
'Voteid': '38',
'Month': '4',
'Year': '2005',
'Vote': 'Frav\xc3\xa6rende',
'Party': 'KD',
'Law': 'L 1',
'ministerie': 'Finansministeriet'}
键范围从1到ca. 500000,每个嵌套字典包含有关丹麦议会一名成员的一票表决信息。此外,还有信息可以确定成员投票的唯一投票。我希望每个成员提取该成员活跃的所有投票,并将这些成员的投票行为与迭代地在同一投票子集上活跃的所有其他成员进行比较。
理想情况下,对于每个成员,我会将该成员与其他成员在他们活跃的投票中进行比较,并计算他们对所有共同投票投票相同的投票比例。如果比例大于,例如.65,那么该对将被添加到列表中。
所以最终结果应该是格式为的列表:
[member1, member2
member1, member4
member1, member7
member2, member5
etc..
]
我可以告诉我如何在python中完成这项工作吗?
答案 0 :(得分:4)
首先,让我们转换数据(我将在这里做一些假设),以便字典的键是议会成员(由Name
标识),每个的数据是他们如何的映射在每个问题(Vote.Numeric
)上投票(Voteid
),因此Voteid
是该子字典中的键。我们可以将其余信息视为无关紧要。
非奇特的程序方式:
member_to_votes = defaultdict(dict)
for item in vote_data:
member_to_votes[item['Name']][item['Voteid']] = item['Vote.Numeric']
现在让我们定义两个投票记录之间的相似性:
def votes_agree(member_a, member_b, threshold):
# Find the union of issues they voted on...
issues = set(member_a.keys()).union(member_b.keys())
# See how many of these they voted the same way on (we use a placeholder
# if one member did not vote on the issue, so that they automatically
# disagree) and compare the fraction of agreeing votes to the threshold.
# There is a little hack in here: `True` is 1 in a numeric context, and
# `False` is zero, so we can add up the boolean results directly.
return sum(
member_a.get(issue, None) == member_b.get(issue, None)
for issue in issues
) / float(len(issues)) >= threshold
现在我们可以创建所有成员对,看看哪些成员同意:
def agreeing_members(member_to_votes, threshold):
return [
[a, b] for a, b in itertools.combinations(member_to_votes.keys(), 2)
if votes_agree(member_to_votes[a], member_to_votes[b], threshold)
]