我有一本字典,结构如下:
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到大约500000,每个嵌套的字典包含一次投票的丹麦议会成员的信息。此外,还有标识该成员投票的唯一投票的信息。我想让每个成员提取该成员活跃的所有投票,并迭代地将该成员的投票行为与同一投票子集上活跃的所有其他成员进行比较。
理想情况下,对于每个成员,我会将该成员与其他成员在他们活跃的选票上进行比较,并计算他们投票相同的选票占他们所有共同选票的比例。如果该比例大于.65,则会将该对添加到列表中。
因此,最终结果应该是一个列表,格式如下:
[member1, member2
member1, member4
member1, member7
member2, member5
etc..
]
我可以告诉我如何在python中做到这一点吗?
发布于 2011-12-26 22:22:09
首先,让我们转换数据(我将在这里做一些假设),以便字典的关键字是国会议员(由Name
标识),每个成员的数据是他们如何投票(Vote.Numeric
)每个问题(Voteid
)的映射,因此Voteid
s是该子字典中的关键字。我们可以丢弃不相关的其余信息。
非花哨的程序方式:
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)
]
https://stackoverflow.com/questions/8639378
复制相似问题