在Python中使用大型数组的工作方式

4
我有三个数组如下所示:
  1. users — 包含50000个用户的id(全都不同)
  2. pusers — 包含拥有一些帖子的用户的id(包含重复的id,也就是说,一个用户可以拥有多个帖子)[50000个值]
  3. score — 包含与pusers中每个值对应的分数。[50000个值]
现在我想要基于以下计算填充另一个数组PScore。对于pusers中每个users的值,我需要获取相应的score并将其添加到相应的索引userPScore数组中。
例如:
if users[5] = 23224
and pusers[6] = pusers[97] = 23224 
then PScore[5] += score[6]+score[97]

需要注意的事项:

  • scorepusers 相关(例如,pusers[5] 具有 score[5]
  • PScore 预计与 users 相关(例如,users[5] 的累积分数为 Pscore[5]
  • 最终目标是将帖子的累积得分分配给拥有该帖子的用户。
  • 没有发布任何帖子的用户被分配一个 score 值为 0。

有人能帮我做这个吗?我尝试了很多次,但一旦运行我的不同试验,输出屏幕就会保持空白,直到我按下 Ctrl+Z 退出。

我查看了以下所有帖子,但我无法有效地将它们用于我的情况。

我是这个论坛的新手,也是Python的初学者。任何帮助对我来说都非常有用。

额外信息

  • 我正在使用StackOverflow数据开展一个小项目。
  • 我正在使用Orange工具,并且正在学习该工具和Python。

好的,我明白我的方法有问题。那么在这种情况下我不应该使用列表吗?请问有谁能告诉我如何继续进行呢?

我得到的数据样例如下所示。

PUsers  Score
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
-1  0
13  0
77  1
77  4
77  3
77  0
77  2
77  2
77  3
102     2
105     0
108     2
108     2
117     2

Users
-1
1
2
3
4
5
8
9
10
11
13
16
17
19
20
22
23
24
25
26
27
29
30
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
48
49
50

我想要的是与每个用户相关的总分数。再次提醒,pusers列表包含重复值,而users列表包含唯一值。我需要以这样的方式存储与每个用户相关的总分数,即如果我说PScore [6],它应该指的是与User [6]相关的总分数。
希望我解答了您的疑问。
提前致谢。

2
请发布您的代码,以便我们提供帮助。 - Tim Tisdall
4
注意:您可能正在谈论列表;数组是Python中的另一种数据类型,位于专用的array模块中,只能容纳同类原始值。 - Martijn Pieters
3
如果您能在帖子中添加一些示例数据,那将对我们很有帮助。显然,您不能粘贴50000个用户的数据,但您可以编写代表10个用户的少量数据('users','pusers','score')。如果您能将数据添加为实际的Python代码(例如users = [123, 123, 456]),以便它具有与您真实数据相同的形式,那就太棒了。请注意,翻译内容不改变原意,并力求通俗易懂,不提供任何解释或额外内容。 - YXD
2
鉴于给出的数字(每个列表有50K个项目),我认为这不是作业......但是使用列表似乎非常错误,你应该有一些数据库来处理你的数据。 - bruno desthuilliers
1
这些数据非常适合关系型数据库。从关系型数据库中找到所需的信息将变得非常简单。请查看sqlite - ratatoskr
显示剩余4条评论
2个回答

2
根据您描述的数组和使用的Python,这看起来是字典的完美候选。不要再用一个数组来存储帖子所有者和另一个数组来存储帖子分数,而是可以创建一个将用户ID映射到得分的字典。在输入数据时,查找字典以查看用户是否已存在。如果存在,则将分数添加到当前得分中。如果不存在,则创建一个新条目。当您循环遍历了所有数据后,应该有一个将用户ID映射到总分数的字典。

http://docs.python.org/2/tutorial/datastructures.html#dictionaries


这听起来正是我想要的... 我会尝试并回复你.. 谢谢!! - Anu145
非常感谢您,您的想法起作用了。现在我的代码看起来更简单易读,不那么复杂,也能达到预期的目的。非常感谢您建议使用字典!谢谢。 - Anu145

1
我认为你的算法可能是错的或者有问题。 试着计算它的复杂度。如果它是N^2或更高,那么你可能使用了低效率的算法。O(N^2)在50000个元素下应该只需要几秒钟。O(N^3)可能需要几分钟。 如果你确信你的方法正确,请尝试用一些虚假小数据运行它,以确定它是否做了正确的事情或者你不小心添加了一些无限循环。
你可以轻松地使用字典将其工作时间降至线性。

哎呀,我的代码要运行好几分钟...我会尝试使用字典并回复你的。谢谢! - Anu145
谢谢让我从复杂性的角度思考。现在我使用字典,发现我的代码更简单,同时运行时间更短。谢谢! - Anu145

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接