我试图迭代一个数字列表以检查项目是以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]
我在这里走错了路吗?任何有关完成任务的提示都表示赞赏。
答案 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)]