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

时间:2015-05-28 22:37:41

标签: python list compare append nested-lists

嵌套列表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这样做。感谢。

1 个答案:

答案 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)