嵌套列表A = [[1, 110, 150, 3], [5, 95, 155, 1], [4, 115, 195, 4], [2, 105, 205, 2]]
。我试图给每个单独的列表分数,计算为score = number of individual nested lists that have ( higher 3rd element value (3, 1, 4, 2) AND a presence in RanksList)
;最初在Rankslist = []
的地方。
因此,基本上需要在每个单独的列表中添加一个元素,RanksList
变为RanksList = [[1, 110, 150, 3, x], [5, 95, 155, 1, x], [4, 115, 195, 4, x], [2, 105, 205, 2, x]]
;其中x
是每个单独列表的计算得分。这就是我到目前为止,我被困住了:
m = 0
n = 0
i = 0
#RanksList = []
A = [[1, 110, 150, 3], [5, 95, 155, 1], [4, 115, 195, 4], [2, 105, 205, 2]]
duplicate_list = A[:]
for m in A:
for n in duplicate_list:
if (n[i][3] < m[i][3]) and (n in RanksList):
RanksList.append(m)
i = i + 1
print(len(RanksList))
print(RanksList)
我尝试复制原始list A
,并将每个嵌套列表中的第三个元素与原始嵌套列表分别进行比较,以填充RanksList
。我是Python的新手,在列表上仍然不稳定。我试图没有numpy这样做。感谢。
答案 0 :(得分:1)
Python for
不需要索引的变量。在for
中,当前迭代的元素将在in
之前的变量中可用。因此,要访问内部列表的第三个元素,您需要类似
for m in A:
for n in A:
if (n[3] > m[3]): # no i
# (increase score for m if n in RankList)
最后,RankList
应为A
中的每个条目都有一个条目。但是如果我们从一开始就将它们填入RankList
,你在分数计算中的条件就没有意义了,所以我猜这不是你想要的。但是,你必须在某些时候填写这些值,并且你不能依赖已经存在的值,否则它将永远不会发生。
一旦我们处理了外部迭代,可能会添加外部迭代的值是你想要的:
RankList = []
for m in A:
for n in A:
if (n[3] > m[3]): # no i
# (increase score for m if n in RankList)
RankList.append(m)
哎呀,语法高亮认为RankList
是一个类,因为它以大写字母开头并继续混合大小写。 (python类的命名约定。不是由语言强制执行,只是一种约定。)让我们重命名它:
rank_list = []
for m in A:
for n in A:
if (n[3] > m[3]):
# (increase score for m if n in rank_list)
rank_list.append(m)
现在我们可以在条件中使用它:
rank_list = []
for m in A:
for n in A:
if (n[3] > m[3]) and (n in rank_list):
# (increase score for m)
rank_list.append(m)
您希望rank_list中的列表将分数作为第5个元素(即索引4
)。
rank_list = []
for m in A:
score = 0
for n in A:
if (n[3] > m[3]) and (n in rank_list):
score += 1
rank_list.append(m + [score])
但等等,n in rank_list
现在总是假的,因为rank_list
将包含不同的列表。让我们使用两个单独的列表,因此:
rank_list = []
already_scored = []
for m in A:
score = 0
for n in A:
if (n[3] > m[3]) and (n in already_scored):
score += 1
rank_list.append(m + [score])
already_scored.append(m)