Python 字符串形式的数字列表上的str.startswith()给出了奇怪的结果

Python 字符串形式的数字列表上的str.startswith()给出了奇怪的结果,python,list,Python,List,我试图迭代一个数字列表,以检查项目是否以1或2开头,如果前者为真,则将1追加到另一个列表,如果后者为真,则将0追加到另一个列表。这些数字在大小上差异很大,因此if-else语句很麻烦 要迭代的列表示例包含2640个项,直至211110: list1 = [1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 11110, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 11210]

我试图迭代一个数字列表,以检查项目是否以1或2开头,如果前者为真,则将1追加到另一个列表,如果后者为真,则将0追加到另一个列表。这些数字在大小上差异很大,因此if-else语句很麻烦

要迭代的列表示例包含2640个项,直至211110:

list1 = [1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 11110, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 11210]
到目前为止,我最接近的方法是检查包含字符串的列表中项目的第一个字母。因此,我尝试将列表1转换为列表字符串,并使用str.startswith检查项目是否以1或2开头:

list1 = str(list1)

list1 = '[1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 11110, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 11210]'

y = []

for i in list1:
    if i.startswith('1'):
        y.append(1)
    else:
        y.append(0)
由此产生的y列表给出了一个奇怪的结果,我不明白为什么:

y = [0,1,1,1,1,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1]

我是不是完全走错了方向?任何完成这项任务的技巧都值得赞赏。

您必须将元素转换为str,而不是列表本身。否则,您将在一个长字符串中迭代各个字符。对于初始整数列表,以下操作应起作用:

y = [int(x.startswith('1')) for x in map(str, list1)]

您正在将列表转换为包含此列表的repr的字符串。然后在repr中的字符上循环

因此,您的循环正在检查“[”、“1”、“1”、“1”、“1”、“1”、“、”、“

一个更简单的解决方案是在循环中临时将每个元素转换为str

y = [1 if str(elt).startswith(('1', '2')) else 0 for elt in list1]
这使用了一种更为精简的结构,称为列表理解。如果你发现它很难阅读,它基本上相当于

y = []
for elt in list1:
    if str(elt).startswith(('1', '2')):
        y.append(1)
    else:
        y.append(0)

元素是字符串还是int?在您的帖子中似乎是int。代码中的缩进目前是一个语法错误。我们可以尝试猜测缩进是什么,但您确实需要注意正确复制/粘贴代码,这取决于要准确表示的空白。对许多人来说,有效的方法是复制/粘贴代码,然后选择粘贴d块并键入ctrl-K,但据我所知,这在该网站的移动版本中不起作用。原始int,但已转换为string。此处代码中未包含转换,将进行修复。您是否想知道Python为什么会这样做,或者如何修复您的代码,使其符合您所说的操作?代码中出现一些错误:缩进是不正确,您正在尝试将startswith方法应用于整数。修复了这些愚蠢的错误,啊,感谢您的澄清。应该注意到列表开头和结尾的“勾号”。谢谢,效果非常好。我接受了您的答案,因为它包含了一个很好的解释。
y = []
for elt in list1:
    if str(elt).startswith(('1', '2')):
        y.append(1)
    else:
        y.append(0)