关于python:如何检查列表中的字符是否在给定集合中?

How to check if a character from a list is in a given set?

在python中给定一组有效字符:

1
valid_chars = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,"-","."}

我试图找出两个字符串是否只由集合中的字符组成,如果不是,该方法将返回false。

1
2
3
for char in zip(latitude, longitude):
    if char not in valid_chars:
        return False

乍一看,我会说这段代码应该工作得很好,但是无论我输入哪一个字符串,这个方法总是返回false。我这里有什么东西不见了吗?

编辑:提供更多关于我要做什么的信息:方法应该通过检查纬度和经度中是否有无效字符来检查一个坐标串是否有效。

下面是该方法应接收的内容的示例:

1
2
is_valid_coordinates("24.53525235, 23.45235") => True
is_valid_coordinates("0.342q0832, 1.2324") => False

这就是我如何从给定参数得到纬度和经度的方法:

1
2
latitude = coordinates[:coordinates.index(',')]
longitude = coordinates[coordinates.index(',') + 2:]


你可以用

1
all(set(word) <= valid_chars for word in [longitude, latitude])

set(word)将字符串映射到其字符集,<=是子集条件。

注意:您应该将valid_chars中的数字转换为字符串,即"1"而不是1以使其正常工作。


zip返回一个元组,但您的集合不包含字符的元组,因此不可能这样做。

另外,您可以使用内置的EDOCX1[1]检查每个元组中的所有项是否都包含在其中:

1
2
3
4
...
for chr1, chr2 in zip(latitude, longitude):
    if chr1 not in valid_chars or chr2 not in valid_chars:
        return False

但是,我不知道你为什么首先需要zip。如果需要遍历两个iterables中的所有项,可以使用itertools.chain

1
2
3
4
5
from itertools import chain

for char in chain(latitude, longitude):
    if char not in valid_chars:
        return False

更新

您可以尝试将这些值解析为浮点数,并查看其是否有效:

1
2
3
4
5
6
7
8
...
try:
   lat, lon ="24.53525235, 23.45235".split(",")
   float(lat), float(lon)
except ValueError:
   return False
else:
   return True


首先,您需要在有效字符中提供字符:

1
valid_chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',"-","."}

然后,方法的代码可以如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
def isvalid_coordinates(str):
    valid_chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',"-","."}
    coords=str.split(",")
    cooncatenation=coords[0]+coords[1]
    for char in cooncatenation:
        if char not in valid_chars:
            return False;
    return True;
def main():
    print isvalid_coordinates("24.53525235, 23.45235")
    print isvalid_coordinates("0.342q0832, 1.2324")
if __name__ =="__main__":
    main()

正如其他答案所指出的,你的zip结果中的每一项都是一对。

插入,连接列表以获得所需的行为:

1
2
3
for char in longitude + latitude:
    if char not in valid_chars:
        return False

首先,您应该使用带有两个变量的zip

埃多克斯1〔5〕

这样,纬度元素将通过其索引与经度元素匹配。所以每一个char1char2匹配。

然后检查它们是否在那个特定的列表中;

1
2
if char1 not in valid_chars or char2 not in valid_chars:
    return false

如果char1char2不在valid_chars中,则返回假。