从Python列表中删除日期

2024-04-23 16:38:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一堆包含字符串的列表,我想从这些字典中删除一些字符串日期,如“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']

Tags: 字符串列表字典rps28wnt5parvaloxl2ptprb
3条回答

在调用remove()时,迭代列表(正如其他人所指出的)不是最佳选择。因此,您可以执行以下操作:

使用列表(原始列表)迭代副本:

# 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)

通过列表理解制作过滤列表:

^{pr2}$

可能还有一种更像Python的方式来做这件事(也许用datetime?)在

真的需要更多信息来诚实地提供解决方案:

  • 它们的格式都一样吗?在
  • 它们都是弦吗?在
  • 问题的范围是什么?在

要从列表中删除,可以使用remove语句,如下所示:

WNT5.remove('b')

这将删除第一个出现的元素(“b”)。要删除所有元素,可以使用列表理解。在

^{pr2}$

这假设只有长度为10的字符串是日期字符串。在

希望有帮助!在

编辑

我回答得有点晚,每个人都有更好的答案,但我也无意中把这个函数用到了另一个可能有用的SO question

from dateutil.parser import parse
def is_date(string):
    try: 
        parse(string)
        return True
    except ValueError:
        return False

然后,您可以使用一个函数来确保要排除的字符串只是日期(任何格式)

例如:

>>> is_date("1990-12-1")
    True
>>> is_date("xyznotadate")
    False
>>> WNT5 = [x for x in WNT5 if not is_date(x)]
>>> print(WNT5)

{1没有日期的新列表}

>>> 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,请将列表理解分配回:

^{pr2}$

或使用“切片”(替换在位项):

WNT5[:] = [s for s in WNT5 if not is_date_string(s)]

相关问题 更多 >