【问题标题】:if item in list exists: do stuff如果列表中的项目存在:做事
【发布时间】:2012-06-06 22:42:52
【问题描述】:

假设我有一个列表,我已经对其进行了编辑,因此它不再只是称为“列表”

my_list = ['a b', 'b c d e', 'c', 'd e f g h', 'e f g h i j', 'f g h', 'g h']

我正在尝试检查列表中的特定元素,并查看其中一个元素是否包含某个字符串。我一直在使用下面代码中的一些东西:

for i in range(len(my_list)):
    splitList = my_list[i].split(' ')
    if splitList[3] == "c":
        print "True"
    else:
        print "False"

但我真正想做的是检查 splitList[3] 是否存在,如果存在,如果它 == "c" 或简单地打印元素中的第三个 "thing"。 (我的问题很笼统,但我的实际数据正在寻找一个特定的 3 个字符串)我确信正则表达式可以解决我所有的问题,但我已经寻找完美的正则表达式解决方案好几天了,不知所措并且没有解决方案。我的数据非常可预测,我只需要检查列表元素中的第二个单词是否存在。

是否有一种简单的 Pythonic 方法来检查 a 列表是否甚至在特定索引处有某些内容,以及是否可以从那里继续?


如果您想提出正则表达式解决方案, 我列表中的第 24 个元素总是 "G# Abc" '#' 可以是 1-12 (含) 那么第25个元素也可能是
"G# Abc" 与 '#' 作为 1-12 如果第 25 个元素不是格式“G# Abc”,则该元素和任何其他元素不相关。如果是“G# Abc”格式,我需要将号码添加到新列表中。

【问题讨论】:

  • 您知道,您可以直接遍历列表。无需获取其长度,构建范围,然后通过索引访问每个列表。
  • 关于第三个元素的检查以及所有这些,我不太清楚你在问什么,但循环本身可以简化:for i in l: splitList = i.split( )
  • @wagras 不要使用list 作为变量名,因为它已经是您将隐藏的内置函数
  • 澄清@jdi,你(几乎)从不做for i in range(len(my_list))。要么做for elt in my_list,要么——如果你需要索引——for i, elt in enumerate(my_list)。
  • 感谢大家的cmets。我不会再使用“列表”作为我的列表名称了。

标签: python regex indexing


【解决方案1】:

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

relevant_elements = set()
for values in my_list:
    try:
        elt = values.split()[3]
    except IndexError:
        continue
    else:
        if is_correct_format(elt):
            relevant_elements.add(elt)

【讨论】:

  • 哈。我讨厌不得不再次发表评论,但 dicts 没有 add() 方法;-)
  • @jdi 哎呀,数学太多了。谢谢。
  • 我没有“接受”这个答案的原因仅仅是因为我对它的理解不够好,无法自如地实施它。 thg453的答案在我的水平,所以我用了它,虽然这看起来更优雅。
【解决方案2】:

给定一个任意字符串'x y z',将['x', 'y', 'z']和'x y z'.split()拆分成一个列表,测试索引是否存在的简单pythonic方法是len。稍微修改上面的代码:

# don't use `list` as a variable name; it masks the built-in `list` constructor
str_list = ['a b', 'b c d e', 'c', 'd e f g h', 'e f g h i j', 'f g h', 'g h']
for s in str_list:
    split_list = s.split(' ')
    if len(split_list) > 3 and split_list[3] == 'c':
        print "True"
    else:
        print "False"

【讨论】:

  • @katrielalex “EAFP”是什么意思?
  • It's Easier to Ask Forgiveness than Permission:这是 Python 编程风格约定之一。这意味着不是检查某事是否可以执行,而是执行并捕获异常(如果不是)。
  • 这非常有效。我从来没有成功地使用带有“and”的“if”语句。没那么复杂。谢谢。
  • @katrielalex,这并不总是那么容易。捕获异常是昂贵的; try/except 应该只在try 块可能会成功时使用。换句话说,except 用于特殊情况。如果两种情况的可能性相同,if 会快得多。
  • @katrielalex,IYI,我不久前看到一篇博客文章,其中包含一些非常有启发性的时间,但找不到了。 Alex Martelli 的This answer 不那么透彻,但仍然很好地表达了这一点。
【解决方案3】:

利用函数式编程的力量。

使用 Python2:

from itertools import imap
for i in (x[3] for x in imap(str.split, input_strings) if len(x) >= 4):
     print i

使用 Python3:

for i in (x[3] for x in map(str.split, input_strings) if len(x) >= 4):
     print(i)

(@thg435 提到:“您可以使用from future_builtins import map 和from __future__ import print_function 使py2 解决方案与py3 相同。”)

解释:

  • str.split 是一个函数,它将输入拆分为(运行)空白字符。
  • map 分别。 imap 将其应用于列表的所有成员。这两个函数都会生成一个generator。
  • if len(x) >= 4 测试是否存在第四项(位于索引 3)。
  • (x[3] for x in ... if ...) 生成一个生成器,它采用拆分字符串列表的第四个元素。

【讨论】:

  • 我不想这么说,但这里的代码太可怕了。我非常喜欢 FP。但是,任何初学者都无法看到这两行代码,并且不考虑 10 ~ 分钟,就可以解码您正在尝试做的事情。
  • itertools.imap in Python 2.x 备注> (编辑:也就是说,map 在 Python 2.x 中效率低下,您应该改用 imap。在 Python 3 中没问题.x)
  • @katrielalex 我是来学习的,感谢提及imap!
  • 投反对票的是我。我现在删除了它,因为它看起来更好一些,但我仍然建议你做 1 件事,每行只做 1 件事。你不需要保存你知道的代码行,雨林将通过节省纸张来保存:-)
  • 还有两个挑剔:您可以使用 from future_builtins import map 和 from __future__ import print_function 使 py2 解决方案与 py3 相同。并且不要调用列表list。
猜你喜欢
  • 2011-06-22
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 2018-12-09
  • 2022-09-30
  • 1970-01-01
相关资源
最近更新 更多