如何根据条件从元组中删除元素?

How to delete an element from a tuple based on a condition?

我正在寻找一种方法来根据 Python 中的条件从元组中完全删除一个元素。以下是我的代码的一部分。如果可能的话,我希望解决方案在第三个 if 子句中做它的事情,以保持我的主要代码的结构。

这是我的代码:

import ast
data = []

myList=[0,"[('AA', 'BB'), ('CC', 'DD'), ('EE', 'FF'), ('GG', 'HH')]"]
 
for a in ast.literal_eval(myList[1]):
                
    Value = a[0]
    Type = a[1]
    
    if(Type == "BB"):
        Value="XX"
                    
    if(Type == "DD"):
        Value="YY" 
                    
    if(Type == "FF"):
        Value=""
                   
    data.append([myList[0], Value])
print(data)

当前输出:

[[0, 'XX'], [0, 'YY'], [0, ''], [0, 'GG']]

我需要的:

[[0, 'XX'], [0, 'YY'], [0, 'GG']]

你只需要检查 Value 变量是否持有任何东西。如果是,则将项目追加到列表中,否则不要追加。

因此,当您要求在另一个 if 条件下执行解决方案时,您可以执行以下操作:

if Value:
    data.append([myList[0], Value])

此处,空白字符串 "" 被视为 False,因此如果值为空白字符串,则不会附加该项目。

import ast
data = []

myList=[0,"[('AA', 'BB'), ('CC', 'DD'), ('EE', 'FF'), ('GG', 'HH')]"]
 
for a in ast.literal_eval(myList[1]):
                
    Value = a[0]
    Type = a[1]
    
    if(Type == "BB"):
        Value="XX"
                    
    if(Type == "DD"):
        Value="YY" 
                    
    if(Type == "FF"):
        Value=""

    if not Value == "":
        data.append([myList[0], Value]) 
print(data)
# [[0, 'XX'], [0, 'YY'], [0, 'GG']]

您还可以让您的代码更短、更清晰、更像 Pythonic:

import ast
data = []

my_lst = [0, "[('AA', 'BB'), ('CC', 'DD'), ('EE', 'FF'), ('GG', 'HH')]"]

type_to_val = {'BB': 'XX', 'DD': 'YY', 'FF': ''}

for tup in ast.literal_eval(my_lst[1]):       
    (cur_val, cur_type) = tup
    try:
        cur_val = type_to_val[cur_type]
    except KeyError:
        pass
    if cur_val != "":
        data.append([my_lst[0], cur_val]) 
print(data)

您可以“过滤”掉附加在最后一个值中的数据。也就是说,如果该数据条目不符合您设置的要求,您将阻止将该数据条目附加到列表中。有几种方法可以做到这一点

  1. 您可以将其设置为仅附加符合条件的值
import ast
data = []

myList=[0,"[('AA', 'BB'), ('CC', 'DD'), ('EE', 'FF'), ('GG', 'HH')]"]
 
for a in ast.literal_eval(myList[1]):
                
    Value = a[0]
    Type = a[1]
    
    if(Type == "BB"):
        Value="XX"
                    
    if(Type == "DD"):
        Value="YY" 
                    
    if(Type != "FF"):                   
        data.append([myList[0], Value])

print(data)
  1. 或者您可以使用 continue 跳过循环的最后部分。这个看起来更好,并使您的代码保持一致。 continue 告诉 python “跳过所有内容直到下一个循环”。
import ast
data = []

myList=[0,"[('AA', 'BB'), ('CC', 'DD'), ('EE', 'FF'), ('GG', 'HH')]"]
 
for a in ast.literal_eval(myList[1]):
                
    Value = a[0]
    Type = a[1]
    
    if(Type == "BB"):
        Value="XX"
                    
    if(Type == "DD"):
        Value="YY" 
                    
    if(Type == "FF"):
        continue
                   
    data.append([myList[0], Value])

print(data)

两者都应该给您想要的结果

实现此目的的一种简单方法是在第三个条件中使用 continue 语句。在循环中可以使用continue语句来跳过循环中剩余代码的执行,return控制到下一次迭代的循环开始。

你的情况:

    if(Type == "FF"):
        continue
                   
    data.append([myList[0], Value])

表示如果类型是 'FF' 则跳过 data.append 语句并且该条目不会添加到您的列表中。

你可以做任何需要的事 list comprehension:

import ast

myList=[0,"[('AA', 'BB'), ('CC', 'DD'), ('EE', 'FF'), ('GG', 'HH')]"]

data = [(myList[0], value) for value, type_ in ast.literal_eval(myList[1] if type_ != "FF"]

print(data)