0

だから私はタプルのリストを与えられています。各タプルには、整数、文字列、およびブール値が含まれています。リストを調べて、そのブール値が False である最初のタプルを見つけ、そのタプルで何らかの操作を行ってから、ブール値を true に変更したいと考えています。サンプルコードは次のとおりです。

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

明らかに、send を 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 に答える