所以我给了一个元组列表。每个元组都包含一个整数,一个字符串和一个布尔值。我想通过列表找到第一个具有该布尔值的False的元组,用元组做一些操作,然后将布尔值更改为true。这是一些示例代码:
def sendnext(packets):
for (number, data, sent) in packets:
if not sent:
sendsegment(number, data)
sent = True
break
显然,我不能只改变发送到True。列表也可以任意增长,所以我不想复制它或使用列表理解。我知道我可以使用索引,但这可能会降低可读性。我觉得应该有一个pythonic方式来做到这一点。有什么建议吗?
感谢您的帮助!
答案 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)
我们放弃对packets
到sendnext
的控制权,然后只使用sendnext
产生的数据包?