'Is there a way to have more relevent variable names in a loop?

I have a list that follows the format :

message = [sender, receiver, message_name]

I have to loop through all my messages stored in my message_stack list and assess for each message whether it's name is valid (i.e if its name is in the valid_names list)

For the moment I have :

for message in message_stack:
    if message[2] not in valid_names:
        print("Error : wrong name.")

The iterator message has a relevant name but is there a way to make message[2] a bit clearer regarding the face that it is a message name ?

Thanks !



Solution 1:[1]

You can use:

for sender, receiver, message_name in message_stack:
    if message_name not in valid_names:
        print("Error : wrong name.")

You can even omit sender and receiver if you won't be using them:

for _, __, message_name in message_stack:
    if message_name not in valid_names:
        print("Error : wrong name.")

Solution 2:[2]

Use star unpack to get last element:

for *_, message_name in message_stack:
    if message_name not in valid_names:
        print(some_thing)

Or consider using namedtuple when creating lists:

from collections import namedtuple
Message = namedtuple('Message', ['sender', 'receiver', 'name'])
message_stack = # a list of Message object
for message in message_stack:
    if message.name not in valid_names:
        print(some_thing)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Dorku
Solution 2