筛选字符串中的特定单词以获取特定关键字,从而在python中生成if语句
我目前正在从事一个项目,我现在的任务是根据Bands列中给出的频段指定设备是否为2G。比如说,筛选字符串中的特定单词以获取特定关键字,从而在python中生成if语句,python,python-2.6,Python,Python 2.6,我目前正在从事一个项目,我现在的任务是根据Bands列中给出的频段指定设备是否为2G。比如说, Device ID |Bands|2G(New added column) 123 |GSM 1800, GSM 700 | 124 | GSM 1800, GSM 700, GSM 1, LTE TDD | 125 | TD-SCDMA,1 SIM |
Device ID |Bands|2G(New added column)
123 |GSM 1800, GSM 700 |
124 | GSM 1800, GSM 700, GSM 1, LTE TDD |
125 | TD-SCDMA,1 SIM |
126 |GSM850 (GSM800),WCDMA FDD Band I,WCDMA FDD Band VIII,2 SIM |
因此,如果列“Bands”只包含单词“GSM”,那么它是2G,否则为N
我曾尝试使用re模块,但在某些方面遇到了问题
import re
import csv
...
two_G_only = []
...
with open('filepath.txt', "rU") as f:
reader = csv.DictReader(f, delimiter = "|")
for row in reader:
...
...
if 'GSM' in row['Bands']:
gsm_only = " ".join(re.findall("[a-zA-Z]+", row['Bands']))
#Im stuck at here because I don't know how to test whether there is only GSM or else
else:
two_G_only.append('N')
...
...
我需要什么结果
Device ID | Bands | 2G
123 | GSM 1800, GSM 700 | Y
124 |GSM 1800, GSM 700, GSM 1, LTE TDD | N
125 |TD-SCDMA,1 SIM | N
126 |GSM850 (GSM800),WCDMA FDD Band I,WCDMA FDD Band VIII,2 SIM|N
提前谢谢,如果我的问题不可理解,请发表评论。我已经搜索了网站上给出的一些解决方案,但我确信所问的问题/概念不同。您显示的数据用制表符或空格分隔成列,但您的代码表明您使用垂直条(
|
)作为分隔符。我不确定哪个是对的,但那是你的问题
据我所知,您的条件是查看第二列中用逗号分隔的各个子字段,如果每个子字段都包含文本字符串“GSM”,则返回一个值(true);如果至少一个子字段不包含该字符串,则返回另一个值(false)。对吧?
然后我们假设您的csv阅读器位于reader
中,如示例所示。循环中的for行是正确的,因为您希望对每一行分别进行此计算
for row in reader:
在该循环中,您需要访问Bands列:
为了检查子字段,让我们使用基本的str.split
函数,用逗号拆分子字段:
subfields = bands.split(',')
现在,让我们将字符串列表转换为布尔值列表,并使用Python的内置函数计算整个列表。我们将通过一个列表来实现这一点:
这个if语句将大致实现它所说的:如果任何一个频段没有包含“GSM”,它将匹配
还有其他一些方法可以编写此代码。例如,可以使用Python函数将否定测试转换为肯定测试。这将反转if语句的“感觉”,并切换手臂:
if all( [ 'GSM' in band for band in subfields ] ):
_2g_or_not_2g = 'Y'
else:
_2g_or_not_2g = 'N'
此外,您还可以使用。。。列表上的if条件
修饰符,用于将列表向下筛选为较小的列表
最后,当然,您可以开始将表达式合并到另一个表达式中-用实际拆分表达式替换
子字段等。需要注意的一点是,在每一行上,带区都用逗号分隔。
您可以利用这一点。
split()
函数可以为该行提供一个字符串列表,每个字符串包含单个频带的名称
现在问题简单多了:如果任何单个频带缺少子字符串“GSM”,则该行被取消资格:返回“N”。
如果该行中没有一个波段不合格(即名称中均包含“GSM”),则为该行返回“Y”
您可以使用find()
函数查看字符串是否包含给定的子字符串。
例如'LTE TDD'.find('GSM')
返回值-1
,因为它不返回值
请注意,您甚至不需要删除设备id—它可以是包含第一个波段的项目的一部分。保持简单:您只想知道,在任何给定行上,所有文本块(用逗号分隔)是否包含子字符串“GSM”…或不包含子字符串
def is_GSM(bands):
for band in bands:
if (band.find('GSM') = -1:
return('N')
return('Y')
for row in reader:
bands = row.split(',')
two_G_only.append(is_GSM(bands))
```
```实际上这是我的错,因为我想让它更容易阅读,所以我将原始数据从以管道分隔的更改为以制表符或空格分隔的。问题已编辑。
if all( [ 'GSM' in band for band in subfields ] ):
_2g_or_not_2g = 'Y'
else:
_2g_or_not_2g = 'N'
def is_GSM(bands):
for band in bands:
if (band.find('GSM') = -1:
return('N')
return('Y')
for row in reader:
bands = row.split(',')
two_G_only.append(is_GSM(bands))
def is_GSM(bands):
for band in bands:
if (band.find('GSM') = -1:
# "GSM" wasn't in the band name
return('N')
# we looked at all the bands, and did not find a disqualifier..
# This row must be "GSM' only 2G bands.
return('Y')
for row in reader:
# not needed: first strip off the device_id in this row's string.
# row = row[3:]
bands = row.split(',')
# ie: bands = ['124 GSM 1800', ' GSM 700', ' GSM 1', ' LTE TDD']
# send this list to is_GSM(), and append the result
two_G_only.append(all_are_GSM(bands))