比较两个嵌套列表并根据嵌套值附加第三个列表 - Python

Compare two nested lists and append a third list based on nested values - Python

嵌套列表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 的情况下做到这一点。谢谢。

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 是 class,因为它以大写字母开头并继续大小写混合。 (python classes 的命名约定。不是语言强制执行的,只是一个约定。)让我们重命名它:

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 现在将始终为 false,因为 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)