[英]In a list, 1 if it fulfills condition 1, 0 if it fulfills condition 2, ignore it if it does not fulfill both
我现在有一个这样的清单。
gen = ["f", 'M', "female", "Male", "male", "F", "m", "m", "male", "Female", "x"]
由于它们可能是不同的输入格式,女性可能会显示为“F”、“f”、“女性”或“女性”,而男性可能会显示为“M”、“m”、“男性”或“男性”在列表中。 我们如何将列表变成一个新的性别列表,称为“gen2”,只有 0 和 1,其中 0 代表女性,1 代表男性。 如果列表中还有其他元素,只是假设它无效并在新列表中忽略它?
我试过这个:
n=0
gen2=[]
for i in gen:
s=print(gen[n][0]==str.lower('F'))
if s is True:
gen2.append(0)
n=n+1
elif s is False:
gen2.append(1)
n=n+1
print(gen2)
并且预期的 output 将是
[0, 1, 0, 1, 1, 0, 1, 1, 1, 0]
gen2=[]
for i in gen:
if i[0].lower() == "f":
gen2.append(0)
else:
gen2.append(1)
print(gen2)
print
总是返回None
——它不适合在这样的逻辑中使用。 此外,不需要n
和i
——你已经有了带有i
的元素(可能只使用i
作为索引,尽管——更喜欢s
、 x
或e
来表示列表中的任意元素)。
您可以使用执行转换的小型查找表,然后在列表理解中过滤和翻译:
>>> gender_to_binary = dict(m=1, M=1, f=0, F=0)
>>> [gender_to_binary[x[0]] for x in gen if x and x[0] in gender_to_binary]
[0, 1, 0, 1, 1, 0, 1, 1, 1, 0]
if x
可以防止空迭代(几乎不需要foo is True
,只需foo
就足够了并且可以干净地读取)。
如果您的逻辑是匹配必须在"m"
/ "male"
/ "f"
/ "female"
大小写上不区分大小写,则更精确:
>>> gender_to_binary = dict(m=1, male=1, f=0, female=0)
>>> [gender_to_binary[x.lower()] for x in gen if x.lower() in gender_to_binary]
[0, 1, 0, 1, 1, 0, 1, 1, 1, 0]
可以使用此代码轻松回答
gen = ["f", 'M', "female", "Male", "male", "F", "m", "m", "male", "Female", "x"]
gen2=[]
for i in gen:
print(i.lower())
if i.lower() == 'f' or i.lower() == 'female':
gen2.append(0)
elif i.lower() == 'm' or i.lower() == 'male':
gen2.append(1)
print(gen2)
这不是有效的方法,但您可以使用两个列表推导
gen = ["f", 'M', "female", "Male", "male", "F", "m", "m", "male", "Female", "x","y"]
a=[0 if x.lower().startswith('f') else 1 if x.lower().startswith('m') else None for x in gen]
[i for i in a if i != None]
在列表理解中使用if
、 else if
和else
。 使用字符串方法lower
和startswith
并在第二个列表理解中删除None
项目。 Output:
[0, 1, 0, 1, 1, 0, 1, 1, 1, 0]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.