在数组和输出索引中查找多个出现的字符串

时间:2015-05-07 07:34:52

标签: python python-2.6

我的数组中充满了不断变化的电子邮件地址。 e.g。

mailAddressList = ['chip@plastroltech.com','spammer@example.test','webdude@plastroltech.com','spammer@example.test','spammer@example.test','support@plastroltech.com']

如何在数组中找到多次出现的相同字符串并输出它的索引?

6 个答案:

答案 0 :(得分:2)

只需通过电子邮件对索引进行分组,并仅打印那些项目,其中索引列表的长度大于1:

from collections import defaultdict
mailAddressList = ['chip@plastroltech.com',
    'spammer@example.test',
    'webdude@plastroltech.com',
    'spammer@example.test',
    'spammer@example.test',
    'support@plastroltech.com'
]

index = defaultdict(list)
for i, email in enumerate(mailAddressList):
    index[email].append(i)

print [(email, positions) for email, positions in index.items()
                        if len(positions) > 1]
# [('spammer@example.test', [1, 3, 4])]

答案 1 :(得分:0)

试试这个:

query = 'spammer@example.test''
indexes = [i for i, x in enumerate(mailAddressList) if x == query]

输出:

[1, 3, 4]

答案 2 :(得分:0)

In [7]: import collections
In [8]: q=collections.Counter(mailAddressList).most_common()

In [9]: indexes = [i for i, x in enumerate(mailAddressList) if x == q[0][0]]

In [10]: indexes
Out[10]: [1, 3, 4]

答案 3 :(得分:0)

注意:之前提交的解决方案比我的更加pythonic。但在我的观点中,我之前写过的文字更容易理解。我只是创建一个字典,然后将邮件地址添加为键,将索引添加为值。

首先声明一个空字典。

>>> dct = {}

然后在m中迭代邮件地址(i)及其索引(mailAddressList)并将其添加到字典中。

>>> for i, m in enumerate(mailAddressList):
...     if m not in dct.keys():
...             dct[m]=[i]
...     else:
...             dct[m].append(i)
... 

现在,dct看起来很像。

>>> dct
{'support@plastroltech.com': [5], 'webdude@plastroltech.com': [2], 
'chip@plastroltech.com': [0], 'spammer@example.test': [1, 3, 4]}

有很多方法可以抓住[1,3,4]。其中之一(也不是那么pythonic :))

>>> [i for i in dct.values() if len(i)>1][0]
[1, 3, 4]

或者

>>> [i for i in dct.items() if len(i[1])>1][0] #you can add [1] to get [1,3,4]
('spammer@example.test', [1, 3, 4])

答案 4 :(得分:0)

这是字典理解解决方案:

result = { i: [ k[0] for k in  list(enumerate(mailAddressList)) if k[1] == i ] for j, i in list(enumerate(mailAddressList)) }
# Gives you: {'webdude@plastroltech.com': [2], 'support@plastroltech.com': [5], 'spammer@example.test': [1, 3, 4], 'chip@plastroltech.com': [0]}

当然,它不是有序的,因为它是一个哈希表。如果您想订购它,可以使用OrderedDict集合。例如,像这样:

from  collections import OrderedDict 
final = OrderedDict(sorted(result.items(), key=lambda t: t[0]))
# Gives you: OrderedDict([('chip@plastroltech.com', [0]), ('spammer@example.test', [1, 3, 4]), ('support@plastroltech.com', [5]), ('webdude@plastroltech.com', [2])])

This discussion不太相关,但也可能对您有用。

答案 5 :(得分:0)

mailAddressList = ["chip@plastroltech.com","spammer@example.test","webdude@plastroltech.com","spammer@example.test","spammer@example.test","support@plastroltech.com"]
print [index for index, address in enumerate(mailAddressList) if mailAddressList.count(address) > 1]

打印[1, 3, 4],列表中出现多次的地址索引。