使用条件删除List的元素

时间:2016-03-07 20:11:34

标签: python

您好,我正在学习使用Python编程来操作数据库,而我无法完成这项简单的任务。请有人帮助我。 我有这个清单

CIS=['4998200lp','2159140lp','02546or']

我想得到这个结果:

CIS=['4998200lp','2159140lp','2546or']

我正在尝试类似的事情:

for x in CIS:
    izq= x[:1]
    if izq == 0:
        CIS=[x.replace(x[:1],'') for x in CIS]
    print (CIS)

我只想删除条件izq == 0的每个字符串的第一个元素。

4 个答案:

答案 0 :(得分:1)

如果您只想删除每个字符串的第一个零,请使用startswith方法。另外,不要查找整数0.查找字符串' 0'。

最后,您可以通过理解来简化您的实施,并使用新数据创建新列表:

[w[1:] if w.startswith('0') else w for w in CIS]

输出:

['4998200lp', '2159140lp', '2546or']

答案 1 :(得分:1)

您的描述与您的示例输入/输出不符,后者也与您的代码不同。

根据示例输入/输出,我怀疑你要做的是从任何以0开头的字符串中删除一个前导0。这并不算太糟糕,但是如果没有要分配的索引,则无法在for循环中执行此操作。为此,您可以使用enumerate

for i, x in enumerate(CIS):
    if x.startswith('0'):  # or x[:1] == '0' if you really prefer
        CIS[i] = x[1:]

或者,您可以使用列表推导来替换CIS

CIS = [x[1:] if x.startswith('0') else x for x in CIS]

并进行变异(而不是制作新的list),使用相同的理解但分配给整个切片,这使得它的行为类似于第一个示例中的拼写循环:

CIS[:] = [x[1:] if x.startswith('0') else x for x in CIS]

如果将CIS作为参数传递给函数,或者在多个位置引用,则会出现示例#1 /#3和示例#2之间的差异。在#1 /#3中,它正在改变list,所以所有引用都会看到更新,在#2中,它会重新分配CIS,但保持原始list不变;如果存在其他引用,它们将不会出现更改。

注意:如果目标是移除所有前导0,请使用str.lstrip,例如:

CIS = [x.lstrip('0') for x in CIS]

对其他方法进行了类似的调整。在这种情况下,您甚至不需要测试是否存在0,因为如果lstrip不以str开头,0会返回未修改的while ((inputLine = in.readLine()) != null) { JSONParser jsonParser = new JSONParser(); JSONArray jsonArray = (JSONArray) jsonParser.parse(inputLine); for (int i = 0; i < jsonArray.size(); i++) { JSONObject object = (JSONObject) jsonArray.get(i); String date = new java.sql.Timestamp(System.currentTimeMillis()).toString(); out.write(date.getBytes()); out.write(",".getBytes()); out.writeBytes((String) object.get("name")); out.write(",".getBytes()); out.writeBytes((String) object.get("label")); out.write(",".getBytes()); out.writeBytes(String.valueOf(object.get("value"))); //out.write(inputLine.getBytes()); out.write("\n".getBytes()); out.hflush(); } 。< / p>

答案 2 :(得分:0)

尝试删除以0开头的每个元素的第一个字符:

CIS=['4998200lp','2159140lp','02546or']
for i,v in enumerate(CIS):
    if v.startswith('0'):
        CIS[i] = v[1:]

CIS  # ['4998200lp', '2159140lp', '2546or']

答案 3 :(得分:0)

实际上,你的循环包含了一种非常接近工作解决方案的方法:

CIS=['4998200lp','2159140lp','02546or']
CIS=[x.replace(x[:1],'') for x in CIS]

但这会剥离所有第一个元素。要仅在'0'(请注意与integer0不同)时替换它们,您需要将if ... else ...纳入列表理解:

CIS=['4998200lp','2159140lp','02546or']
CIS=[x.replace(x[:1],'',1) if x[:1] == '0' else x for x in CIS ]

if ... else ...语法可能有点奇怪,但只是尝试大声读取代码:“如果第一个字符为零则插入替换的x,或者如果不插入x,则插入CIS中的每个x”。< / p>

其他答案包含更为复杂的方法,但我只是想添加这个答案,让您提醒您正确的方向!

但是如果for循环遍历同一个iterable,那么在<% @total_sales_volume.each do |record| %> <%= record.transaction_date %> <% end %> 循环中使用列表理解通常是个坏主意。大多数情况下,你只想要其中一个。