【问题标题】:Adding first occurrence in a 2D list to another list (Python 3.4.2)将 2D 列表中的第一次出现添加到另一个列表(Python 3.4.2)
【发布时间】:2015-04-29 08:34:21
【问题描述】:

这是我目前的代码:

num = 0
sav = [["Name: ", "Josh", "Score", "1"], ["Name", "James", "Score: ", "2"], ["Name: ", "Josh", "Score: ", "2"]]
sav2 = [[]*5 for _ in range(len(sav)]
name2 = sav[num][1]

for i, j in enumerate(sav2):
    if name2 not in j:
        sav2.append(sav[num])
        num = num+1
        print('hi')
    else:
        print('hello')
        num = num+1

print(sav2)

理想情况下,只要名称不存在,每个名称和分数都会进入sav2。但是,当我运行它时,我得到一个错误 - sav2.append(sav[num]) 中的列表索引超出范围。 (注意 - "hi""hello" 只是为了确保我的 if/else 语句正常工作(确实如此)。)

最终结果:

sav2 = [["Name: ", "Josh","Score: ", "1"], ["Name: ", "James", "Score: ", "2"]]

【问题讨论】:

  • 附加到您正在迭代的列表不是最好的主意。
  • num 是什么,你在做什么以及为什么
  • 有什么想法可以做得更好吗?
  • num 只是增加索引在列表中的距离
  • 但是...你为什么不直接使用 i....你有 for i, j in enumerate(sav2)

标签: python python-3.x for-loop multidimensional-array enumerate


【解决方案1】:

我认为没有理由枚举,因为列表中的索引对结果并不重要。只需遍历列表,取出两个值,然后简单地验证取出的第一个值是否已经在 sav2 中。您可以利用 for 循环中的 else 子句来完成此操作,如果找到匹配项,则与 break 语句结合使用。

    sav = [["Josh", "1"], ["James", "2"], ["Josh", "2"]]
    sav2 = []
    for i, j in sav:
        for name, num in sav2:
            if name == i:
                break
        else:
            sav2.append([i,j])
    print(sav2)

【讨论】:

  • 我看到你在我刚开始回答时更改了 sav 的内容。我不知道您为什么将 Name 和 Score 添加到列表中的值中,因为它们似乎没有添加任何内容,但是如果需要,可以将它们添加到上述 for 循环中。不过,上面的 dict 答案相当不错。
【解决方案2】:

将它们存储在字典中怎么样?

sav2 = {}
for (name, number) in list_of_lists:
    if name not in sav2:
         sav2[name] = number

导致:

sav2 = {"Josh":"1", "James":"2"}

如果您需要保留列表排序,您可以使用 OrderedDict,如果您想要足够简单,可以返回列表列表:

sav2list = [[k,v] for k,v in sav2.items()]

当您需要向代码添加功能时,将它们放在字典中几乎肯定会对您有所帮助,因为您可能希望按值而不是索引来查找内容。

【讨论】:

  • 刚刚更新了我的问题以稍微改变它 - 我该怎么做?
  • 我不确定我将如何改变它(虽然它在我的原始版本中运行良好)
  • 如果你使用的数据有很多字段,为什么不使用像 pandas 这样适合这个的库呢?无论如何,唯一的区别是 (name, number) 变成了 (name, field1, field2, number)。
  • 因为我不在自己的电脑上工作,所以无法下载熊猫。但是,当我尝试您的下一个解决方案时,我得到了太多的值来解压错误(预期为 4)
  • 折腾了一些代码最终得到了一个包含元组的字典,但它仍然包含所有名称,包括重复项
猜你喜欢
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多