【问题标题】:Best way to remove elements in list based on string pattern基于字符串模式删除列表中元素的最佳方法
【发布时间】:2017-10-25 01:45:37
【问题描述】:

我有一个表(列表列表)。示例输出如下:

table = ['dd03', 'ff0000', 'a30b32', '000000', '234fas', '00ffff', 'ffffff', '0000ff', '0200ff']

我想删除列表中包含“ff”任意组合的所有元素,或者该元素中至少有 2/6 个字符的元素。

我已经完成了一个列表理解,它可以完成这项工作,但它显然不是很有效,并且肯定可以用更少的代码来完成。

    table = [[part for part in my_list if part != 'ffffff'] for my_list in table]
    table = [[part for part in my_list if part != 'ffff00'] for my_list in table]
    table = [[part for part in my_list if part != 'ff0000'] for my_list in table]
    table = [[part for part in my_list if part != '0000ff'] for my_list in table]
    table = [[part for part in my_list if part != '00ffff'] for my_list in table]
    table = [[part for part in my_list if part != 'ffff'] for my_list in table]
    table = [[part for part in my_list if part != 'ff'] for my_list in table]
    table = [[part for part in my_list if part != 'ffff02'] for my_list in table]
    table = [[part for part in my_list if part != '0200ff'] for my_list in table]

我想也许可以为模式设置一个正则表达式变量以查找然后删除匹配的元素......但我不太熟悉这个包并在这种情况下实现它。

任何方向都将不胜感激。

干杯

【问题讨论】:

  • if条件改为:if 'ff' not in part
  • 您能否更清楚地解释 2/6 条件?为什么不能只计算f 在每个字符串中出现的次数?
  • 'f34fas' 会算作拥有 2/6ths 'f's 吗?
  • 到目前为止,所有的答案都是错误的。在OP明确问题之前,没有人应该回答。当问题得到正确指定和回答时,猜测 OP 意图的答案只会产生噪音。

标签: python regex python-2.7


【解决方案1】:

一个简单的遏制检查应该可以工作:

[item for item in table if 'ff' not in item]

'atleast 2/6' 条件相当多余(长度为常数 6),足以检查 item 是否不包含 'ff'

【讨论】:

  • OP 可能意味着'f's 可能不符合 2/6 规则。
  • @Ev.Kounis 我怀疑,仔细看看他们的代码就知道他们在一起了
  • 如果有的话,ff 条件是多余的。而且长度不是固定的。
【解决方案2】:

试试这个:

table = ['dd03', 'ff0000', 'a30b32', '000000', '234fas', '00ffff', 'ffffff', '0000ff', '0200ff']
filtered_table = [item for item in table if item.count('f') < 2]

【讨论】:

  • 由于并非所有字符串的长度都相同,因此仅检查是否有两个或多个fs 是不够的。
  • @pzp 你的意思是应该是if item.count('f') / len(item) &lt; 1/3
  • @Ev.Kounis 是的,虽然它确实应该是if len(item) &gt; 3 * item.count('f') 以避免浮点除法问题。
【解决方案3】:

你可以像这样得到没有ff的元素,

In [29]: print [i for i in table if 'ff' not in i]
['dd03', 'a30b32', '000000', '234fas']

【讨论】:

    【解决方案4】:

    你可以循环遍历列表的元素并pop()包含子字符串的那些:

    for item in list_of_items:
        if "ff" in item:
            list_of_items.pop(list_of_items.index(item))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2013-09-18
      相关资源
      最近更新 更多