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

时间:2013-11-14 03:20:36

标签: python iterator

所以我给了一个元组列表。每个元组都包含一个整数,一个字符串和一个布尔值。我想通过列表找到第一个具有该布尔值的False的元组,用元组做一些操作,然后将布尔值更改为true。这是一些示例代码:

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

显然,我不能只改变发送到True。列表也可以任意增长,所以我不想复制它或使用列表理解。我知道我可以使用索引,但这可能会降低可读性。我觉得应该有一个pythonic方式来做到这一点。有什么建议吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我会定义一个Packet类,然后只对每个Packet对象执行操作

# 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

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

答案 1 :(得分:1)

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

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

为简单起见,迭代可以使用枚举:

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

答案 2 :(得分:0)

你能在这里使用生成器方法来映射迭代数据包的一些计算吗?类似的东西:

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

我们放弃对packetssendnext的控制权,然后只使用sendnext产生的数据包?