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

How to distinguish same int and float elements?

我有以下任务:创建一个函数,它将接收不同元素列表和 return 原始元素列表作为参数(列表中每个元素的数量不应超过 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

但在 return 中得到了 [1, '1', -1],因为 1==1.0True。那么如何强制Python到"distinguish"相同值的int和float元素并得到正确的输出列表呢?

如果顺序不重要,只需使用类型和集合理解。

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

对您的解决方案稍作修改:

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

您还可以执行以下操作:

>>> 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。我们计算 output 列表中等于输入列表中 item 的所有元素的 indexes
如果 indexes 列表为空,我们将 item 附加到 output 列表。否则,对于 output 列表中的每个索引,我们过滤掉那些 item 类型和 output 列表中元素类型相同的索引。如果过滤后得到的列表为空,我们将 item 添加到 output 列表,否则该类型的 item 已经添加到 output 列表。

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

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

这将保留顺序并过滤掉重复项,而忽略不同类型的唯一值。