Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
筛选字符串中的特定单词以获取特定关键字,从而在python中生成if语句_Python_Python 2.6 - Fatal编程技术网

筛选字符串中的特定单词以获取特定关键字,从而在python中生成if语句

筛选字符串中的特定单词以获取特定关键字,从而在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 |

我目前正在从事一个项目,我现在的任务是根据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 |                                              
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))