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

时间:2018-01-05 13:31:46

标签: python list

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

要迭代的列表示例(包含2640个项目,最多可达2111210):

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

到目前为止,我最接近的是检查第一封字母的方法"列表中包含字符串的项目。因此,我尝试将list1转换为列表字符串,并使用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]

我在这里走错了路吗?任何有关完成任务的提示都表示赞赏。

2 个答案:

答案 0 :(得分:1)

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

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

所以,你的循环正在检查'[', '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)

答案 1 :(得分:0)

您必须将元素转换为str,而不是list本身。否则,您将在一个长字符串中迭代单个字符。以下应该为初始的整数列表提供技巧:

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