在python中迭代时更改列表的单个元素

在python中迭代时更改列表的单个元素,python,iterator,Python,Iterator,所以我得到了一个元组列表。每个元组包含一个整数、一个字符串和一个布尔值。我想遍历列表,找到第一个布尔值为False的元组,对该元组执行一些操作,然后将布尔值更改为true。下面是一些示例代码: def sendnext(packets): for (number, data, sent) in packets: if not sent: sendsegment(number, data) sent = True

所以我得到了一个元组列表。每个元组包含一个整数、一个字符串和一个布尔值。我想遍历列表,找到第一个布尔值为False的元组,对该元组执行一些操作,然后将布尔值更改为true。下面是一些示例代码:

def sendnext(packets):
    for (number, data, sent) in packets:
        if not sent:
            sendsegment(number, data)
            sent = True
            break
很明显,我不能把它改成真的。列表也可以任意增长,所以我不想复制它或使用列表。我知道我可以使用索引,但这可能会降低可读性。我觉得应该有一种类似蟒蛇的方法来做到这一点。有什么建议吗


谢谢你的帮助

我将定义一个
数据包
类,然后简单地对每个
数据包
对象执行操作

# assuming a Packet class has been defined and you have a list of Packet objects
for packet in packets:
  if not packet.sent:
    sendsegment(packet.number, packet.data)
    packet.sent = true
    break

特别是由于您将在其他地方使用数据包,并且可能是程序中的主要组件,因此避免使用任意数据列表可能更容易和更易于管理。

我将定义一个
数据包
类,然后简单地对每个
数据包
对象执行操作

# assuming a Packet class has been defined and you have a list of Packet objects
for packet in packets:
  if not packet.sent:
    sendsegment(packet.number, packet.data)
    packet.sent = true
    break

特别是由于您将在其他地方使用数据包,并且可能是程序中的主要组件,因此避免使用任意数据列表可能更容易和更易于管理。

我将定义一个
数据包
类,然后简单地对每个
数据包
对象执行操作

# assuming a Packet class has been defined and you have a list of Packet objects
for packet in packets:
  if not packet.sent:
    sendsegment(packet.number, packet.data)
    packet.sent = true
    break

特别是由于您将在其他地方使用数据包,并且可能是程序中的主要组件,因此避免使用任意数据列表可能更容易和更易于管理。

我将定义一个
数据包
类,然后简单地对每个
数据包
对象执行操作

# assuming a Packet class has been defined and you have a list of Packet objects
for packet in packets:
  if not packet.sent:
    sendsegment(packet.number, packet.data)
    packet.sent = true
    break

特别是由于您将在其他地方使用数据包,并且可能是程序中的一个主要组件,因此避免使用任意数据列表可能更容易和更易于管理。

只需使用索引变量,即可更改实际值,而不是副本:

def sendnext(packets):
    for i in range(len(packets)):
        if not packets[i][2]:
            sendsegment(packets[i][0], packets[i][1])
            packets[i] = (packets[i][0], packets[i][1], True)
            break
为简单起见,可以使用enumerate完成迭代:

def sendnext(packets):
    for i, (number, data, sent) in enumerate(packets):
        if not sent:
            sendsegment(number, data)
            packets[i] = (number, data, True)
            break

只需使用索引变量,即可更改实际值,而不是副本:

def sendnext(packets):
    for i in range(len(packets)):
        if not packets[i][2]:
            sendsegment(packets[i][0], packets[i][1])
            packets[i] = (packets[i][0], packets[i][1], True)
            break
为简单起见,可以使用enumerate完成迭代:

def sendnext(packets):
    for i, (number, data, sent) in enumerate(packets):
        if not sent:
            sendsegment(number, data)
            packets[i] = (number, data, True)
            break

只需使用索引变量,即可更改实际值,而不是副本:

def sendnext(packets):
    for i in range(len(packets)):
        if not packets[i][2]:
            sendsegment(packets[i][0], packets[i][1])
            packets[i] = (packets[i][0], packets[i][1], True)
            break
为简单起见,可以使用enumerate完成迭代:

def sendnext(packets):
    for i, (number, data, sent) in enumerate(packets):
        if not sent:
            sendsegment(number, data)
            packets[i] = (number, data, True)
            break

只需使用索引变量,即可更改实际值,而不是副本:

def sendnext(packets):
    for i in range(len(packets)):
        if not packets[i][2]:
            sendsegment(packets[i][0], packets[i][1])
            packets[i] = (packets[i][0], packets[i][1], True)
            break
为简单起见,可以使用enumerate完成迭代:

def sendnext(packets):
    for i, (number, data, sent) in enumerate(packets):
        if not sent:
            sendsegment(number, data)
            packets[i] = (number, data, True)
            break

您可以在这里使用生成器方法来映射数据包迭代中的一些计算吗?比如:

def sendnext(packets):
    for (number, data, sent) in packets:
        if not sent:
            sendsegment(number, data)
            yield (number, data, True)
        else:
            yield (number, data, True)

我们将
数据包的控制权让给
sendnext
,然后只使用
sendnext
生成的数据包?

您能在这里使用生成器方法来映射数据包迭代中的一些计算吗?比如:

def sendnext(packets):
    for (number, data, sent) in packets:
        if not sent:
            sendsegment(number, data)
            yield (number, data, True)
        else:
            yield (number, data, True)

我们将
数据包的控制权让给
sendnext
,然后只使用
sendnext
生成的数据包?

您能在这里使用生成器方法来映射数据包迭代中的一些计算吗?比如:

def sendnext(packets):
    for (number, data, sent) in packets:
        if not sent:
            sendsegment(number, data)
            yield (number, data, True)
        else:
            yield (number, data, True)

我们将
数据包的控制权让给
sendnext
,然后只使用
sendnext
生成的数据包?

您能在这里使用生成器方法来映射数据包迭代中的一些计算吗?比如:

def sendnext(packets):
    for (number, data, sent) in packets:
        if not sent:
            sendsegment(number, data)
            yield (number, data, True)
        else:
            yield (number, data, True)


我们将
数据包
的控制权让给
发送下一个
,然后只使用
发送下一个
生成的数据包?

以后需要保留数据包吗?或者,如果sent=False,您只需执行
sendsegment
?是的,稍后将使用它们。数据包实际上是一个全局列表。以后是否需要保留数据包?或者,如果sent=False,您只需执行
sendsegment
?是的,稍后将使用它们。数据包实际上是一个全局列表。以后是否需要保留数据包?或者,如果sent=False,您只需执行
sendsegment
?是的,稍后将使用它们。数据包实际上是一个全局列表。以后是否需要保留数据包?或者,如果sent=False,您只需执行
sendsegment
?是的,稍后将使用它们。数据包实际上是一个全局列表。这是一个好主意,但不幸的是我无法更改数据包的定义方式。这是一个好主意,但不幸的是我无法更改数据包的定义方式。这是一个好主意,但不幸的是我无法更改数据包的定义方式。这是一个好主意,但不幸的是,我无法更改数据包的定义方式。倒数第二行是packets[I]=(packets[I][0],packets[I][1],True)。我想我最终会使用这一行,但那一行让我感到不安。这看起来不错,只是它更简洁,更不容易出错,使用“索引,枚举中的数据包(packets)”而不是范围(len)。@Championcake哇,我总是忘了元组元素不能被分配到(因为元组是不可变的)。我修正了答案。@dstromberg我的偏好通常是索引(可能是因为C风格的移植),但这当然更简洁。我包括了一个更可读的选项,包括
enumerate
。请注意,元组解包可以在
for
行中完成,例如:
for I,(number,data,sent)in enumerate(packets):
。如果你习惯了,那样会更清楚;-)倒数第二行是packets[i]=(packets[i][0],packets[i][1],True)。我想我最终会使用这一行,但那一行让我感到不安。这看起来不错,只是它更简洁,更不容易出错,使用“索引,枚举中的数据包(packets)”而不是范围(len)。@Championcake哇,我总是忘了元组元素不能被分配到(因为元组是不可变的)。我修正了答案。@dstromberg我的偏好通常是索引