我现在有一个这样的清单。
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)
并且预期的输出将是
[0, 1, 0, 1, 1, 0, 1, 1, 1, 0]
答案 0 :(得分:1)
gen2=[]
for i in gen:
if i[0].lower() == "f":
gen2.append(0)
else:
gen2.append(1)
print(gen2)
答案 1 :(得分:0)
print
总是返回 None
——它不适合在这样的逻辑中使用。此外,不需要 n
和 i
--您已经拥有带有 i
的元素(可能仅使用 i
作为索引,但--prefer {{1} }、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"
答案 2 :(得分: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)
答案 3 :(得分:0)
这不是有效的方法,但您可以使用两种列表推导式
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
项。
输出:
[0, 1, 0, 1, 1, 0, 1, 1, 1, 0]