在列表中查找重复浮点数的索引

时间:2016-04-01 14:37:32

标签: python linux duplicates

我输入了一个非常大的浮点数列表,给出了一个样本

[1.2, 2.4, 3.1, 4.0, 5.6, 6.5, 1.2, 3.1, 8.1, 23.6, 29.3]

我想找到所有重复项及其索引,即列表中的位置。重复项只会成对出现;从不超过两次。

输出应该像

1.2  1 7
3.1  3 8

所以只有两个条目1.2和3.1作为重复出现,它们的位置分别为1,7和3,8。

有关python的任何建议吗?

2 个答案:

答案 0 :(得分:1)

你可以尝试类似的东西:

x = [1.2, 2.4, 3.1, 4.0, 5.6, 6.5, 1.2, 3.1, 8.1, 23.6, 29.3]
for el in set(x):
    if x.count(el) > 1:
        print el, x.count(el), len(x) - x[::-1].index(el)

输出(具有重复,数量,最后一次出现的索引的元素):

1.2 2 7
3.1 2 8

答案 1 :(得分:1)

进一步采取xi_的答案。通过添加列表推导,它将提供包含该值的所有索引的列表。

x = [1.2, 2.4, 3.1, 4.0, 5.6, 6.5, 1.2, 3.1, 8.1, 23.6, 29.3]
for el in set(x):
    if x.count(el) > 1:
        print el, " ".join([str(index) for index, value in enumerate(x) if value == el])

您将获得以下输出:(基于0的索引)

1.2 0 6
3.1 2 7

修改

[str(index) for index, value in enumerate(x) if value == el]

的说明

这是枚举x,它创建列表的枚举对象,它将返回(<index>, <value>)的元组对

然后使用for index, value in enumerate(x)

循环遍历此枚举对象

if value == el检查每个value,如果它等于el,那么我们会评估,否则我们什么都不做。

str(index)是根据我们上面定义的条件进行评估的部分。它返回index的字符串版本,这是一个整数类型。

这将提供一个列表([]之间的所有代码),然后将其传递给字符串方法join(list),该方法连接{{1}中的所有项目1}}使用list中的值(在本例中为空格,可以是任何字符串。),从创建的列表中提供一个空格分隔值字符串。

我还假设你甚至可以在以后想要这些数据,而不仅仅是打印它。这是一个版本。这将创建一个空字典" ",然后我们创建一个带有值(y = {})的键的新条目,为其提供索引列表。

el

如果你做x = [1.2, 2.4, 3.1, 4.0, 5.6, 6.5, 1.2, 3.1, 8.1, 23.6, 29.3] y = {} for el in set(x): if x.count(el) > 1: y[el] = [str(index) for index, value in enumerate(x) if value == el] 这就是你应该得到的:

print y

<强> EDIT2

打印{3.1: ['2', '7'], 1.2: ['0', '6']} 以使其与您指定的输出相匹配。做这样的事情:

y

输出:

print "\n".join(["{} {}".format(key, " ".join(vals)) for key, vals in y.iteritems()])

这样做是通过:3.1 2 7 1.2 0 6 迭代字典y,使{:for key, vals in y.iteritems()字符串生成:"<key> <values...>"这将返回字符串列表所以我们使用"{} {}".format(key, " ".join(vals))加入他们,以便在每一行上创建它们。

现在需要注意的是,由于字典是一个哈希值,因此不会对键的输出顺序进行排序。如果你想这样做,那么你可以将上面的代码更改为:

"\n"

输出:

print "\n".join(["{} {}".format(key, " ".join(y[key])) for key in sorted(y.keys())])