【问题标题】:Accessing y-coordinates in a list of tuples访问元组列表中的 y 坐标
【发布时间】:2017-02-24 23:56:01
【问题描述】:

我有一个配对列表,其中列表类似于 li = [(a,b), (c,d), ... , (t, u)]。我试图索引每个元组的 y 坐标,以计算有多少元组的 y 坐标为 0、1 或 2,但不确定如何操作。调用 li[i] 只返回 (a,b) 而不是我想要的特定坐标 (b)。我搜索了类似的问题,所以我能够得到一些列表理解,但仍然无法处理循环。我的代码目前如下所示:

for i in range(len(li)):
    if (x,y) for x, y in li if y == 0:
        zero_count += 1
    elif (x,y) for x, y in li if y == 1:
        one_count += 1
    # if y-coordinate = 2
    else:
        two_count += 1   

【问题讨论】:

  • 嵌套索引 li[i][j],在 for 循环或理解中使用 zip(*li) 更有趣
  • @f5r5e5d 使用 zip 意味着 x 和 y 坐标分别有 2 个单独的列表。你对乐趣的看法很奇怪。

标签: python list indexing tuples


【解决方案1】:

你得到元组

li[i]

要获取第二个元素,您可以在 that 表达式中添加一个下标:

li[i][1]

请注意,在其他情况下,您的“拆包”参考是一个好主意,有效地使用

x, y = li[i]

在一个作业中同时获取两个元素。

【讨论】:

  • 感谢您的简单回答。我目前收到此错误“TypeError:'sage.rings.integer.Integer' object is not iterable”。你会碰巧知道为什么会发生这个错误吗?这似乎是由于 for 循环中的第一行,但我不确定。
  • 不是真的,因为 (1) 这根本不是您发布的代码的一部分; (2) 您还没有发布完整的错误信息(确实表明该行); (3) 单独的问题应该在单独的问题中发布。然而,简单的检查方法是在你的 for 语句前面放一个简单的 print:打印出 in右边的东西> 关键字,看看它是什么。错误告诉你这个东西不是它可以迭代的序列。例如,它可能是一个简单的整数,而不是一个元组列表。
【解决方案2】:

您可以使用for (a,b) in li 类型语法从列表中解压缩元组。此代码应该执行您的代码尝试执行的操作:

counts = [0,0,0]

for (x,y) in li:
    counts[y] +=1

假设 y 坐标只能是 0,1 或 2 - 正如您的帖子所暗示的那样

【讨论】:

    【解决方案3】:

    如果您在 for 循环中使用范围,这将返回您的 y 值:

    for i in range(len(li)):
        print li[i][1]
    

    如果你不需要 li 索引,你也可以这样做:

    for i in li:
        print i[1]
    

    【讨论】:

    • 如果您确实需要列表或其他可迭代的索引和元素 - 使用 enumerate 比使用 range(len(<iterable>)) 好得多
    • @TonySuffolk66 很有趣。我假设您的意思是使用for i, l in enumerate(li)。您是否愿意详细说明为什么它比使用range() 好得多?
    • 你可能听说过 zen of pythonpythonic 代码 - enumerate 被认为更像 Python - 首先它让你可以直接访问list - 不需要两个函数,然后索引到列表中。对于习惯了 Python 的人来说,enumerate 更具可读性——因为强制 for 循环计算数字(通过使用 range(len(li)) 被认为试图使 python 像 C 一样。对于大型列表,枚举似乎确实有性能也稍好一些 - 但改进幅度很小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多