Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表中的元组中删除空字符串_Python_Regex_List_Tuples - Fatal编程技术网

Python 从列表中的元组中删除空字符串

Python 从列表中的元组中删除空字符串,python,regex,list,tuples,Python,Regex,List,Tuples,现在,我有三个列表,它们是由RE-findall函数生成的,我正在尝试从列表中的元组中删除一些空字符串。在这个过程中,数字也应转换为整数: 获得:[('','1','1')] 预期:[(1,1)] 获得:[('','20','500'),('21','failed','','')] 预期:[(20500),(21,'失败')] 获取:[('3','failed','48','23'),('48','96','0')] 预期:[(3,'failed'),(48,23),(96,0)] 有什么想法吗

现在,我有三个列表,它们是由RE-findall函数生成的,我正在尝试从列表中的元组中删除一些空字符串。在这个过程中,数字也应转换为整数:

获得:
[('','1','1')]

预期:
[(1,1)]

获得:
[('','20','500'),('21','failed','','')]

预期:
[(20500),(21,'失败')]

获取:
[('3','failed','48','23'),('48','96','0')]

预期:
[(3,'failed'),(48,23),(96,0)]

有什么想法吗?

这个怎么样:

def sanitize(t):                                
    for i in t:
        try:
            yield int(i)
        except ValueError:
            yield i

inputs = [('3', 'failed', '', ''), ('', '', '48', '23'), ('', '', '96', '0')]
map(tuple, map(sanitize, [filter(None, i) for i in inputs]))
给出以下输出:

[(3, 'failed'), (48, 23), (96, 0)]
filter
是一个对序列进行操作并仅返回“truthy”元素的函数。空字符串是错误的。Map是另一个函数,它接受一个序列并通过给定的函数运行该序列中的每个元素。在本例中,函数
sanitize
可以将字符串转换为int,否则只返回字符串


我们在
sanitize
函数中使用
yield
而不是
return
,作为将另一个序列返回到下一个map函数的简单方法。或者,我们可以在函数内部构建一个列表并返回它

具有元组构造函数的嵌套列表理解:

>>> lst = [('', '', '20', '500'), ('21', 'failed', '', '')]
>>> [(tuple(int(x) if x.isdigit() else x for x in _ if x)) for _ in lst]
[(20, 500), (21, 'failed')]

对于
lst
中的每个元组(
),使用生成器表达式构造一个
元组。仅元组构造函数如下所示:

tuple(int(x) if x.isdigit() else x for x in _ if x)
这看起来很混乱,但我会把它分解。对于tuple
中的每个字符串
x
(它是
lst
中的一个tuple),构造一个tuple
if x
检查字符串是否为空。(如果字符串
x
为空,
x
为假。)
如果x
,生成器表达式将根据所讨论的
x
是否为字符串形式的数字生成
x
int(x)
。(尝试将非数字字符串转换为整数将导致异常。)

对于
lst
中的每个元组
,生成器将创建一个新的、相同的元组,但会过滤掉空的假字符串,并将任何数字字符串转换为
int
s

上述代码相当于:

new_lst = []

for _ in lst: # For each tuple in lst
    for x in _: # For each string in tuple
        temp_tuple = ()
        if x: # Only add to tuple if string is not empty
            if x.isdigit(): # If x is a digit in string form
                temp_tuple += (int(x),) # Convert to int
            else:
                temp_tuple += (x,) # Keep string
    new_lst.append(temp_tuple)

你用的是哪个正则表达式?为什么不先使用一个与空字符串不匹配的正则表达式,然后再将其过滤掉呢?我尽了最大的努力…但我无法写出不同的正则表达式…好吧,也许我们可以帮你解决这个问题?任务报告(“是的,任务3失败。Raid 48完成:找到目标:23。任务96完成,找到目标:0”)应该返回[(3,'failed'),(48,23),(96,0)]。我为此编写的正则表达式是:match=re.findall(r'(?:raid | mission)(\d+)(failed)(\d+)(:was)?已完成。*?find:(\d+),s,re.IGNORECASE)啊,好的,所以总是有两个空的反向引用。我懂了。好吧,让我们按你的方式来做……等一下。你们想解释一下吗?它返回[(500,),()]@user3238319你必须用准确的输入和输出编辑代码。只是在文件的开头再次运行了我的代码,它对我来说非常有效。在提交之前,我在一个shell中测试了它,所以它是有效的。你必须发布你的实际代码,让我知道出了什么问题。试着剥离图层,找出哪一层不起作用。调试!使用Python控制台进行这类操作。只需再次仔细检查,将准确的代码复制到终端并运行它。很好。如果您愿意,我将重新格式化它,使其不显示输出。这是返回的map对象。我想它与python版本有关。没错,这是Python2,如果你将它包装成
list
,你就会得到指定的输出。