【问题标题】:Using the elements of a list twice两次使用列表的元素
【发布时间】:2014-06-25 13:03:19
【问题描述】:

您好,我如何在每次 cs 循环时使用列表 'trav_time' 中的每个元素两次进行评估路由函数中的两个不同计算。它适用于 fit,但会为 fit1 提供以下错误。谢谢

trav_time = iter([3,6,7,9,11])
value_of_time = 15
trnsfr_pen = 0.21

def evaluate_routes():

    fitness = []
    fitness1 = []

    for cs in range(5):

        fit = (trav_time.next() * (5 /  trnsfr_pen) * value_of_time)

        fitness.append(fit)

        fit1 = trav_time.next() * 3

        fitness1.append(fit1)


    print "fitness: ",fitness
    print
    print "fitness: ",fitness1

    return fitness

evaluate_routes()

Traceback (most recent call last):
  File "C:/Users/AMAMIFE/Desktop/obi/hey.py", line 251, in <module>
    evaluate_routes()
  File "C:/Users/AMAMIFE/Desktop/obi/hey.py", line 240, in evaluate_routes
    fit1 = trav_time.next() * 3
StopIteration

【问题讨论】:

  • 请注意,trav_time 是一个列表,但您的代码和错误消息表明它是一个生成器。
  • @DominicKexel:你在朋友之间试图解决的实际问题有什么谎言?
  • @DominicKexel 我认为你的意思是迭代器。
  • @jpmc26 嗯,是的,我愿意 :-)
  • @Dominic kexel,我刚刚编辑过 trav_time 是列表的迭代器 trav_time = iter([3,6,7,9,11])

标签: python python-2.7


【解决方案1】:

在 Python 中,您可以像这样遍历列表中的每个项目:

trav_time = [3,6,7,9,11]
value_of_time = 15
trnsfr_pen = 0.21

def evaluate_routes():

    fitness = []
    fitness1 = []

    for item in trav_time:
        fit = (item * (5 /  trnsfr_pen) * value_of_time)
        fitness.append(fit)
        fit1 = item * 3
        fitness1.append(fit1)

    print "fitness: ",fitness
    return fitness

evaluate_routes()

让你不必用你不使用的值对循环进行硬编码

【讨论】:

  • 可以,但不是我想要的。对于范围(5)中的 cs 是特别需要的。谢谢
  • @Nobi 为什么需要它?你为什么用next()
  • 它是因为这只是我正在处理的真正问题的一个小插曲。硬编码的循环范围(5)应该表示我要在函数内部使用的另一个列表。但是代码很多,不知道贴在论坛上会不会引起关注
  • 你能不能也循环浏览其他列表?还是在循环内使用计数器?
【解决方案2】:

你错了。此代码不适用于fitfit1,这是因为您调用了两次next。每次调用next 时,它都会获取下一个元素。这意味着您每次迭代都会获取 2 个不同的元素。您需要修改代码,以便每次循环迭代只获取 一个 元素。我将离开弄清楚如何只为您获取一次作为练习;这完全在你的能力范围内。稍微考虑一下。

在现实世界的代码中,您几乎不需要直接调用next。您通常会找到一些没有它的循环方式,例如使用循环或生成器。

最后,您发布的代码不是导致您遇到的错误的代码。您发布的代码会导致AttributeError: 'list' object has no attribute 'next'(OP 修正了错字。)

【讨论】:

  • 感谢您的想法,这是一个错字,我已经编辑了它 trav_time = iter([3,6,7,9,11])。那么有没有办法两次使用该列表中的元素?谢谢
  • @Nobi 是的,有很多方法。这是最简单的提示。您只能拨打next 一次。如何不重复使用一个值多次?您如何重复使用相同的fitnessfitness1 列表而不总是创建新列表,或者您如何避免在代码中为“传输笔”多次输入0.21?我特别避免实际为您编写代码;我认为你会从自己的工作中受益更多。
  • 谢谢,我做了这个 temp = trav_time.next(),然后我可以多次使用 temp。感谢您让我尝试自己解决问题的方法,但您的提示。我很感激,如果还有其他有用的观点,请放弃它们。几周前我才开始用 python 编程,所以我仍然觉得有些东西很难。
  • @Nobi 是的,这正是我的想法。 =)我们曾经都是新人,我们都发现(坦率地说,仍然发现)事情令人困惑。对于这个特定的问题,我认为我需要更多地了解整个问题,才能就如何编写代码提出任何真正的建议。在所有情况下,我实际上只会给出几条建议:始终尝试将您的代码分解为非常短的逻辑片段,非常努力地命名事物,使任何白痴都能理解它们,并且永远不要盲目依赖任何过程或实践。
  • 很好的答案,但我不同意next 很少被显式调用。我用它所有的时间。跳过文本文件中的标题就是一个很好的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多