我输入了一个非常大的浮点数列表,给出了一个样本
[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的任何建议吗?
答案 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())])