可以通过理解为列表做嵌套条件吗?

时间:2021-03-31 21:09:46

标签: python for-loop list-comprehension

我正在挑战自己把事情变成这样

if a and b and c:
  do_something(x) ## some function
elif a and b and c and d
  do_something(x[:-1]) ## the same function but slightly different

像这样

cosa = [do_something(x) for x in X if a and b and c
        or
        do_something(x[:-1]) for x in X if a and b and c and d]

在 Python 中可以吗?我已经被告知要使用 for 循环,但我很好奇是否有办法处理这个问题,因为函数 do_something 的行为只有一点点变化。


对我想做的事情的更具体描述:

                history[chat_name] = [chats.message('chat_type',
                                                line.split(',',4)[3],
                                                line.split(',',4)[1],
                                                line.split(',',4)[2],
                                                line.split(',',4)[4][:-1]) 
                                      for line 
                                      in file 
                                      if line.split(',',4)[0] == chat_type 
                                      and line.split(',',4)[2] == chat_name]

我正在编写一个应该模拟聊天应用程序的代码。变量 chat_type 表示它是群聊 ('grupo') 还是个人聊天 ('regular')。因为,在谈到聊天组时,只要他们在该组中,谁发送消息并不重要,因此此代码就足够了,可以完成工作。

但是,当涉及个人聊天时,上面的代码使代码包含任何人写给给定收件人的所有消息。我想添加一个条件,如果且仅当 chat_type 设置为“常规”,则代码必须确保发件人是当前用户。

我修正如下:

            if chat_type == 'grupo':
                history[chat_name] = [chats.message('chat_type',
                                                line.split(',',4)[3],
                                                line.split(',',4)[1],
                                                line.split(',',4)[2],
                                                line.split(',',4)[4][:-1]) 
                                      for line 
                                      in file 
                                      if line.split(',',4)[0] == chat_type 
                                      and line.split(',',4)[2] == chat_name]
            elif chat_type == 'regular':
                history[chat_name] = [chats.message('chat_type',
                                                line.split(',',4)[3],
                                                line.split(',',4)[1],
                                                line.split(',',4)[2],
                                                line.split(',',4)[4][:-1]) 
                                      for line 
                                      in file 
                                      if line.split(',',4)[0] == chat_type 
                                      and line.split(',',4)[2] == chat_name
                                      and line.split(',',4)[1] == self.username] ##this is the extra condition

我希望这有助于回答我的问题。

1 个答案:

答案 0 :(得分:0)

这应该是做您需要的正确方法

cosa = [do_something(x) if a and b and c else do_something(x[:-1]) if a and b and c and d for x in X]