我有一堆包含字符串的列表,我想从这些词典中删除一些字符串日期,例如'2017-09-11','2017-09-17','2015-09-11'。我该怎么办?
WNT5 = ['RBPMS', 'TRIM2', 'GPM6A', 'TACC1', '2017-09-06', 'PARVA', 'RPS28', 'MAN1C1', 'LOXL2', 'PTPRB', 'STAG2', 'SFRS15', 'PDS5B', 'SWAP70', 'ZMIZ2', 'TPD52', 'OGT', 'RSU1', 'TGFBR3', 'NFAT5', 'ANGPT1', 'SLC25A36', 'NFIB', 'FBXO9', 'N4BP2L2', 'CCDC69', 'MYH11', 'LPP', 'USP34', 'ITIH5', 'GLS', 'SORBS2', 'TMEM43', 'ANK3', 'PSIP1', 'SYNPO2', 'C9orf5', 'BCL2', 'NSMAF', 'MLXIP', 'PDE8B', 'RABGAP1', 'RPS15A', 'NLRP12', 'AKAP1', 'PLK1S1', 'SLC4A4', 'COBLL1', 'ARHGEF7', 'CD47', 'TMEM132A', 'TNK2', 'WWC1', 'RPL22', 'NMT2', 'TNXB', 'SCPEP1', 'TTLL5', 'MAGI1', 'GOLGA2B', 'TIMELESS', 'ITPR1', 'ALMS1', 'TLE2', 'MAPT', 'DIP2A', 'PCGF3', 'CYP3A4', 'RALGPS1', 'N4BP2L1', 'DIO2', 'PPP1R3C', 'LRIG1', 'NSMCE4A', 'GPX2', 'SETBP1', 'SLC6A16', 'ARL5A']
答案 0 :(得分:1)
使用disjoint set data structure,您将获得一个没有日期字符串的新列表:
>>> def is_date_string(s):
... # return re.search(r'^\d{4}-\d{2}-\d{2}$')
... return '-' in s and s[:4].isdigit() # NOTE not perfect, change as you need
...
>>> [s for s in WNT5 if not is_date_string(s)]
['RBPMS', 'TRIM2', 'GPM6A', 'TACC1', 'PARVA', 'RPS28',
'MAN1C1', 'LOXL2', 'PTPRB', 'STAG2', 'SFRS15', 'PDS5B', 'SWAP70',
'ZMIZ2', 'TPD52', 'OGT', 'RSU1', 'TGFBR3', 'NFAT5', 'ANGPT1',
'SLC25A36', 'NFIB', 'FBXO9', 'N4BP2L2', 'CCDC69', 'MYH11', 'LPP',
'USP34', 'ITIH5', 'GLS', 'SORBS2', 'TMEM43', 'ANK3', 'PSIP1',
'SYNPO2', 'C9orf5', 'BCL2', 'NSMAF', 'MLXIP', 'PDE8B', 'RABGAP1',
'RPS15A', 'NLRP12', 'AKAP1', 'PLK1S1', 'SLC4A4', 'COBLL1', 'ARHGEF7',
'CD47', 'TMEM132A', 'TNK2', 'WWC1', 'RPL22', 'NMT2', 'TNXB',
'SCPEP1', 'TTLL5', 'MAGI1', 'GOLGA2B', 'TIMELESS', 'ITPR1', 'ALMS1',
'TLE2', 'MAPT', 'DIP2A', 'PCGF3', 'CYP3A4', 'RALGPS1', 'N4BP2L1',
'DIO2', 'PPP1R3C', 'LRIG1', 'NSMCE4A', 'GPX2', 'SETBP1', 'SLC6A16',
'ARL5A']
要替换WNT5
,请分配列表理解:
WNT5 = [s for s in WNT5 if not is_date_string(s)]
或使用切片(以替换项目):
WNT5[:] = [s for s in WNT5 if not is_date_string(s)]
答案 1 :(得分:1)
在调用remove()
时,迭代列表(正如其他人指出的那样)不是最佳选择。所以你可以做到以下几点:
使用list(original_list)迭代副本:
# makes a copy of the list to iterate rather than original
for item in list(WNT5):
# assumes dates are yyyy-mm-dd and all contain the '-'
# split() returns a list object
# it will only split the '-' if its there, wont error
if (len(item) == 10) and (len(item.split('-')) == 3):
WNT5.remove(item)
通过列表理解制作过滤后的列表:
def is_not_date(WNT5):
for item in WNT5:
if not ((len(item) == 10) and (len(item.split('-')) == 3)):
yield item
new_WNT5 = [x for x in is_not_date(WNT5)]
可能有更多的pythonic方式(可能是datetime
?)
真的需要更多信息才能诚实地提供解决方案:
答案 2 :(得分:1)
要从列表中删除,您可以像这样使用remove语句:
WNT5.remove('b')
这将删除该元素的第一次出现(' b')。要删除所有元素,可以使用列表推导。
>>> WNT5 = [x for x in WNT5 if len(x) != 10]
>>> print(WNT5)
这假设长度为10的唯一字符串是日期字符串。
希望它有所帮助!
修改强>
我回答得有点迟了,每个人都有更好的答案,但我也偶然发现了另一个可能有用的SO question函数:
from dateutil.parser import parse
def is_date(string):
try:
parse(string)
return True
except ValueError:
return False
然后你有一个可以运行的功能,以确保你排除的字符串只是日期(任何格式)
EX:
>>> is_date("1990-12-1")
True
>>> is_date("xyznotadate")
False
>>> WNT5 = [x for x in WNT5 if not is_date(x)]
>>> print(WNT5)
答案 3 :(得分:0)
问题没有完全明确,但我认为即使您在问题中指定了一个列表,也可以解释如何像列表一样操纵字典。
mydict = {'2017-04-11':22, '2017-04-12':23, '2017-04-13': 128}
newkeys = list(mydict.keys())
newkeys.remove('2017-04-12')
newvals = [mydict[keptkey] for keptkey in newkeys]
newdict = dict(zip(newkeys, newvals))
获得新密钥列表后,您可以按照自己喜欢的方式截断元素。
答案 4 :(得分:0)
taskdef class com.puppycrawl.tools.checkstyle.CheckStyleTask cannot be found using the classloader AntClassLoader[]
答案 5 :(得分:-1)
您也可以尝试使用正则表达式方法:
import re
result_list = [element for element in WNT5 if re.search("[0-9]{4}\-[0-9]{2}\-[0-9]{2}", element) is None]
如果您想使用此方法,可以添加更多日期模式。