0

可能重复:
迭代时修改列表

我被赋予了在 python 中编写代码的任务,该代码将删除列表中多次出现的所有成员,并留下一份副本。条件:它应该不区分大小写

所以我写下了以下代码:

string = raw_input()
list1 = string.split(",")
low_case_list = list1[:] #for case-insesitive
for i in range(len(low_case_list)):
    low_case_list[i] = low_case_list[i].lower()
for member in low_case_list:
    if(low_case_list.count(member) > 1):
        del list1[low_case_list.index(member)]
        del low_case_list[low_case_list.index(member)]

输入后我得到这个列表: [a,b,c,d,A,B,C,D,a,b,c,d] 并且在我对其进行操作之后: [B,D,a,b ,光盘]

我的问题是,为什么它在删除成员时会跳过“B”和“D”?

4

3 回答 3

1

试试这个,应该很简单。鉴于您的清单li

lowcase = [elem.lower() for elem in li]
output = []
for el in lowcase:
  if el not in output: output.append(el)
return output # if necessary, otherwise a simple li = output

或者,以更快、更优雅的方式,您可以将整个for循环替换为:

[output.append(el) for el in lowcase if el not in output]

您的代码应该是错误的,因为您引用了元素的索引,但是列表在循环期间会更改大小,因此索引也会更改。

编辑:没有考虑套装,显然它们是这里最好的解决方案。

于 2012-12-18T18:45:45.863 回答
1

为什么不将您listset所有元素转换为a lower-case,然后再转换为 a list。您可以使用 agenerator将每个元素转换为lowercase.

你可以这样做: -

>>> l = ['a', 'b', 'c', 'A', 'B', 'C', 'a', 'b', 'c']
>>> new_list = list(set(elem.lower() for elem in l))
>>> new_list
['a', 'c', 'b']

请注意,订单可能会更改,因为set不维护order其元素。

于 2012-12-18T18:28:54.720 回答
1

你可以尝试这样的事情:

input = raw_input().split(',')
unique = set([s.lower() for s in input])
result = list(unique)
于 2012-12-18T18:28:29.447 回答