0

假设我有一个我已经编辑过的列表,所以它不再只是被称为“列表”了

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”,我需要将数字添加到新列表中。

4

3 回答 3

7

有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

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)
于 2012-06-01T17:07:51.620 回答
4

使用函数式编程的力量。

使用 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 mapandfrom __future__ import print_function使 py2 解决方案与 py3 相同。”)

解释:

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

给定一个任意字符串'x y z',用 拆分成一个列表['x', 'y', 'z']'x y z'.split()测试索引是否存在的简单 Python 方法是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"
于 2012-06-01T17:09:58.313 回答