如果有一个包含4个字符串元素的列表。几个元素是由“-”分隔的字符串。如果我想打印出这个“-”分隔单词的某一部分

3
list2 = ['BIA-660', 'Web', 'Analytics']

问题:如何从list2中提取"660"?

list2 = ['BIA-660', 'Web', 'Analytics']
c=list2[0]
x=c.split("-")
print(x[1])

我已经得到答案,但是想知道是否有另一种更有效的方法来实现这个解决方案。


我认为没有比这更简单的了。你可以使用print(list2[0].split('-')[1])来避免所有中间变量。 - Barmar
你可以使用 split 的第二个参数来限制分割的次数,或者使用 rsplit,具体取决于你需要哪些元素。 - cmd
3个回答

1
您可以使用正则表达式从字符串中获取任何数字。
import re

list2 = ['BIA-660', 'Web', 'Analytics']

for strg in list2:
    found = re.findall('\d+', strg)
    if found != []:
        for num in found:
            print(num)

输出:

660

我相当确定正则表达式不比分割更有效率。 - cmd
是的,正则表达式可能不会更有效率,但它能够概括地从任何字符串中获取数字。 - perpetualstudent

1
这将返回字符串中包含的数字列表:
list2 = ['BIA-660', 'Web', 'Analytics']
s = '-'.join(list2)

# extract numbers from string
result = [int(txt) for txt in s.split('-') if txt.isdigit()]
print(result)

[660]

1
原始代码无法运行,如果您不介意的话,我进行了编辑,谢谢! :-) - perpetualstudent

0

我发现在处理这些东西时,获取结果的同时知道结果来自哪里非常重要。因此,除了返回数据外,它还会告诉输入列表中找到该索引的位置。

还考虑了由一个或多个“-”分隔的多个项目,以及像 foo-bar-zoom 这样的情况。

def extractor(li : list[str]) -> list[tuple[str,int]]:

    res = []
    for ix, v in enumerate(li):
        if "-" in v:
            found = v.split('-',maxsplit=1)[1]
            res.append((found,ix))

    return res

一些运行:

✅! 
extractor for ['BIA-660', 'Web', 'Analytics']                                                                      
exp :[('660', 0)]:
got :[('660', 0)]:

✅! 
extractor for ['BIA-660', 'Web-3.0', 'Analytics']                                                                  
exp :[('660', 0), ('3.0', 1)]:
got :[('660', 0), ('3.0', 1)]:

✅! 
extractor for ['BIA-660', 'foo-bar-zoom']                                                                          
exp :[('660', 0), ('bar-zoom', 1)]:
got :[('660', 0), ('bar-zoom', 1)]:


你可以扩展它以忽略不是字符串的列表项(isinstance(v,str)),并且提取的值不是数字(检查float(found)是否成功)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接