0

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

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

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

谢谢你的帮助!

4

3 回答 3

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

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

于 2013-11-14T03:28:01.823 回答
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

为简单起见,可以使用 enumerate 进行迭代:

def sendnext(packets):
    for i, (number, data, sent) in enumerate(packets):
        if not sent:
            sendsegment(number, data)
            packets[i] = (number, data, True)
            break
于 2013-11-14T03:29:20.900 回答
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)

我们在哪里放弃对packetsto的控制sendnext,然后只使用由 产生的数据包sendnext

于 2013-11-14T03:33:18.783 回答