在列表中,如果满足条件 1,则为 1,如果满足条件 2,则为 0,如果同时不满足,则忽略它

时间:2021-02-28 18:01:47

标签: python list

我现在有一个这样的清单。

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]

4 个答案:

答案 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——它不适合在这样的逻辑中使用。此外,不需要 ni--您已经拥有带有 i 的元素(可能仅使用 i 作为索引,但--prefer {{1} }、sx 来表示列表中的任意元素)。

您可以使用一个小的查找表来执行转换,然后在列表理解中过滤和翻译:

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]

在列表理解中使用 ifelse ifelse。使用字符串方法 lowerstartswith 并在第二个列表理解中删除 None 项。 输出:

[0, 1, 0, 1, 1, 0, 1, 1, 1, 0]