python中关于各种正则表达式和列表长度的条件语句
我有以下清单:python中关于各种正则表达式和列表长度的条件语句,python,regex,list,maxlength,Python,Regex,List,Maxlength,我有以下清单: ['E12.2', 'E16.1', 'E15.1'] ['E10.1', 'I11.2', 'I10.1_27353757'] ['E16.1', 'E18.1', 'E17.3'] ['E1.8', 'I12.1_111682336', 'I12.1_111682195'] ['E55.1', 'E57.1', 'E56.1','E88.1'] ['U22.3', 'U22.6_13735517', 'U23.1'] 我想提出一个条件,过滤掉那些a)
['E12.2', 'E16.1', 'E15.1']
['E10.1', 'I11.2', 'I10.1_27353757']
['E16.1', 'E18.1', 'E17.3']
['E1.8', 'I12.1_111682336', 'I12.1_111682195']
['E55.1', 'E57.1', 'E56.1','E88.1']
['U22.3', 'U22.6_13735517', 'U23.1']
我想提出一个条件,过滤掉那些a)长度等于3 b)不包含“U”c)不包含字母“U”的列表
我试图在一行中实现,我该怎么做?我有以下条件工作,我知道你可以使用正则表达式模块匹配列表中的正则表达式,但我可以在一行中完成所有条件吗
if(len(fin_list) == 3)
这是一种可能的方法:
lists = [['E12.2', 'E16.1', 'E15.1'],
['E10.1', 'I11.2', 'I10.1_27353757'],
['E16.1', 'E18.1', 'E17.3'],
['E1.8', 'I12.1_111682336', 'I12.1_111682195'],
['E55.1', 'E57.1', 'E56.1','E88.1'],
['U22.3', 'U22.6_13735517', 'U23.1']]
for lst in lists:
if len(lst) != 3 and not any('_' in item or 'U' in item for item in lst):
print(lst)
# Output:
# ['E55.1', 'E57.1', 'E56.1', 'E88.1']
这里有趣的一点是在生成器表达式上使用any
。要分解它,这将迭代lst
中的每个项
,并应用测试以查看\uu
或U
是否在其中。该列表理解会导致列表中每个项目的True
/False
any
然后查找第一个True
。如果找到一个,它会立即返回True
。如果没有找到,则返回False
编辑
好的,我们已经清楚地进入了“仅仅因为你可以并不意味着你应该”的领域,但这里有一个解决方案,它包含了评论中引入的新条件:
from collections import Counter
import re
lists = [['E12.2', 'E16.1', 'E15.1'],
['E10.1', 'I11.2', 'I10.1_27353757'],
['E16.1', 'E18.1', 'E17.3'],
['E1.8', 'I12.1_111682336', 'I12.1_111682195'],
['E55.1', 'E57.1', 'E56.1','E88.1'],
['U22.3', 'U22.6_13735517', 'U23.1'],
['E7.2', 'E9.5', 'E9.3']]
for lst in lists:
if (len(lst) != 3 and not any('_' in item or 'U' in item for item in lst) and
(Counter(match.groups(1) for match in [re.match(r'E(\d+)\.', item) for item in lst] if match is not None)
.most_common(1) or [(None, 1)])[0][1] == 1):
print(lst)
# Output:
# ['E55.1', 'E57.1', 'E56.1', 'E88.1']
Counter
计数,re.match
尝试查找E
s之后的数字,最常见的(1)或[(无,1)]
是确保即使没有匹配的元素,我们仍然可以索引到结果中并查找最大的出现次数
虽然前面的代码还可以,但现在这是一个糟糕的代码,应该移到另一个函数中。:-) 一个班轮:
ls= [['E12.2', 'E16.1', 'E15.1'],
['E10.1', 'I11.2', 'I10.1_27353757'],
['E16.1', 'E18.1', 'E17.3'],
['E1.8', 'I12.1_111682336', 'I12.1_111682195'],
['E55.1', 'E57.1', 'E56.1','E88.1'],
['U22.3', 'U22.6_13735517', 'U23.1']]
print(list(filter(lambda l : not any(('_' in x or 'U' in x) for x in l),filter(lambda l : len(l)!=3,ls))))
结果:
[['E55.1', 'E57.1', 'E56.1', 'E88.1']]
我承认这很复杂,但符合规格,因为它是一个单衬里:
- 外部筛选条件为:否定(下划线或U不包含在列表的任何元素中)
- 内部过滤器条件:列表长度!=3.最好从这开始,以避免对元素进行不必要的处理
map(set('U')。intersection,l)
hi smarx,alex我有另一行,列表为['E7.2'、'E9.5'、'E9.3'],我想设置另一个条件,即我不希望E之后的任何内容具有相同的数字(在这种情况下,这两种情况下都是E9),如何删除这些行?我能想到的一件事是拆分,如果有一种方法可以将所有内容都包含在同一行中。为此,E9.3与E9.5相同,但据推测(从前面的示例中),E55.1与E56.1不同。是这样吗?(您是否将其解释为一个E后跟一个十进制数,并忽略小数点后的所有内容?)嗨,smarx,我想删除所有列表,即E之后的所有常见内容,无论是E9还是E55,因此将删除列表['E7.2'、'E9.5'、'E9.3']以及列表['E7.2'、'E55.5'、'E55.3'],不,只有数字相同的,所以E55.1和E56.1会有所不同。我想你想要的就是我说的。例如,E55.5和E56.1都以“E5”开头,但您可以接受。如果所有的数字都在E后面,但在小数点之前匹配,你只想考虑它们“重复”。如果你考虑到这类事情,我认为列表理解更可读。例如,转换我的答案:[如果len(lst)!=3,则列表中的lst为lst,而不是任何('uu'在项目中或'U'在项目中,对于lst中的项目)]
。这肯定更好,是的<代码>过滤器在您必须将其转换为列表
时失去了魅力。你应该把这个加到你的答案里。我会的。