如何区分相同的int和float元素?

时间:2015-05-27 18:00:04

标签: python list floating-point integer

我得到了以下任务:创建一个函数,它将接收不同元素列表作为参数,并返回原始元素列表(列表中每个元素的计数不应超过1)。元素的顺序应该保留。如下所示:

[1, 1.0, '1', -1, 1] # input
[1, 1.0, '1', -1] # output

我试过

def original_list(*a):
    b=[]    
    for i in a:
        if i not in b:
            b.append(i)
return b

[1, '1', -1]获得了1==1.0True<input type="text" id="datepicker"/>。那么如何强制Python“区分”int和浮动相同值的元素并获得正确的输出列表?

3 个答案:

答案 0 :(得分:2)

如果订购并不重要,只需使用类型和设置理解。

input = [1, 1.0, '1', -1, 1]

output = [x[0] for x in {(y, type(y)) for y in input}]

print output

您可以使用相同的想法来保留订购。

output = []
output_filter = set()
for y in input:
    if (y, type(y)) not in output_filter:
        output_filter.add((y, type(y)))
        output.append(y)
print output

答案 1 :(得分:1)

对您的解决方案进行一些修改:

def original_list(a):
    b=[]    
    for i in a:
        if i not in b or not isinstance(i,int):
            b.append(i)
    return b

答案 2 :(得分:1)

您还可以执行以下操作:

>>> example_list = [1, 1.0, '1', -1, 1, 1.0]
>>> output = []
>>> for item in example_list:
        indexes = [i for i, x in enumerate(output) if x==item]
        if not indexes:
            output.append(item)
        elif not filter(lambda index: type(item) == type(output[index]) , indexes):
            output.append(item)
        indexes = []

我们有一个输入列表和一个最初为空的output列表。首先,我们迭代输入列表的每个item。我们计算indexes列表中与输入列表中的output相等的所有元素的item
如果indexes列表为空,我们会将item附加到output列表。否则,对于output列表中的每个索引,我们过滤掉那些item类型的索引,并且该索引的output列表中的元素类型相同。如果过滤后获得的列表为空,我们会将item附加到output列表,否则该类型的item已添加到output列表中。

迭代后,output列表是我们的最终列表。

>>> output
[1, 1.0, '1', -1]

这将保留订单并过滤掉重复项,从而省略不同类型的唯一值。