如何在列表中找到重复的单个字符串?

时间:2014-07-27 00:04:56

标签: python associations data-mining

我尝试了这个解决方案:Find a repeating pattern in a list of strings。但它从我的列表格式不起作用。我没有得到任何错误,但它显示错误的答案。我使用了相同的代码,并使用dict存储了所有带有密钥的列表:

common_suffix = os.path.commonprefix([listDict[::-1] for items in listDict])[::-1]
stripped_titles = [items[:-len(common_suffix)] for items in listDict]
print len(stripped_titles) 

我得到的答案是0。

以下是清单。我已经从CSV文件数据中创建了这些列表:

list1 = ['a1', 'b2', 'c4', 'y7', 'u5']
list2 = ['b4', 't5', 'g1']
list3 = ['b2', 'c4', 'f6', 'a1']
list4 = ['b2', 'a1']
list5 = ['r4', 'c4', 'a1', 'b2']

这里我想找到重复的字符串。可以说,我想要三个元素a1, b2, c4(来自list1),我想知道这三个字符串在其他列表中存在多少次。订单无关紧要。字符串项应该在其他列表中。在这种情况下,list {1},list3和list5中存在a1, b2, c4。所以我希望答案是“list1的前三个元素重复3个其他列表”。

如何使用以下功能完成此操作:我希望能够选择一个数字,让我们说k = 3,然后将测试所有列表的第一个三个元素的重复模式,输出将是的,

a1, b2, c4 = 3

等等。

4 个答案:

答案 0 :(得分:2)

如果我理解你的目标(计算所有项目出现的每个列表,包括第一个),你可以这样做:

lists=[ ['a1', 'b2', 'c4', 'y7', 'u5'],
        ['b4', 't5', 'g1'],
        ['b2', 'c4', 'f6', 'a1'],
        ['b2', 'a1'],
        ['r4', 'c4', 'a1', 'b2']]

k=3
tgt=tuple(lists[0][0:k])
di={tgt:1}
for li in lists[1:]:
    if all(e in li for e in tgt):
        di[tgt]+=1

print(di)

打印:

{('a1', 'b2', 'c4'): 3}

如果您想简化为一行:

di={tgt:sum(all(e in li for e in tgt) for li in lists)}

然后,如果你想要你的确切输出:

>>> print '{}={}'.format(', '.join(tgt), di[tgt])
a1, b2, c4=3

答案 1 :(得分:1)

我理解这个问题的方式,你问的是:给定一组字符串,返回任何这些字符串出现的列表数。

因此,对于list4k=2,我们有'b2''a1'。两者都出现在list1中,因此我们得到一个列表。不会显示在list2中,因此不会添加1.它们都会显示在list3list5中,总共会生成3个列表(不包括原始list4)。但是,如果只包含'b2''a1'中的一个,我的解决方案也会添加一个列表。

首先是一个带有列表列表的解决方案,然后是一个带有列表字典的列表。

list1 = ['a1', 'b2', 'c4', 'y7', 'u5']
list2 = ['b4', 't5', 'g1']
list3 = ['b2', 'c4', 'f6', 'a1']
list4 = ['b2', 'a1']
list5 = ['r4', 'c4', 'a1', 'b2']

我已将您的列表打包到列表列表中。

lall= [list1,list2,list3,list4,list5]

def cmatch1( lall, l0, k ):
    """ lall: a list of lists
        l0: the list to check
        k: number of entries from beginning of l0 to look for
    """
    m = 0
    for li in lall:
        # dont check against supplied list
        if li is l0:
            continue
        # loop over first k entries in supplied list
        for cn in l0[:k]:
            # if any of them appear in another list increment and break out
            if cn in li:
                m += 1
                break
    return m

如果你有一个列表词典,

dl = {'list1':list1, 'list2':list2, 'list3':list3, 'list4':list4, 'list5':list5}

def cmatch2( dl, key, k ):
    """ dl: a dict of lists
        key: key of list to check
        k: number of entries from beginning of dl[key] to look for
    """
    m = 0
    for ki,li in dl.items():
        # dont check against supplied list
        if ki == key:
            continue
        # loop over first k entries in supplied list
        for cn in dl[key][:k]:
            # if any of them appear in another list increment and break out
            if cn in li:
                m += 1
                break
    return m

如果您想检查每个列表中的前三个条目与其他每个列表,您可以调用上述函数,使用第二个参数指示每个列表一次。当k=3list4没有k条目时,您不确定要发生什么,但您可以在外部循环中检查列表。

如果你这样做,

>>> cmatch2( dl, 'list1', 3 )
3

>>> cmatch2( dl, 'list2', 3 )
0

>>> cmatch3( dl, 'list3', 2 )
3

答案 2 :(得分:1)

我会使用counter:

from collections import Counter

def find_common(k,l):
    c = Counter()
    for ele in l:
        c.update(ele[:k])
    most_com = c.most_common()
    final = [x for x in c if c[x] == most_com[0][1]]+[most_com[0][1]]
    return final
print find_common(3,lists)
['a1', 'b2', 'c4', 3]

答案 3 :(得分:1)

如果订单信息不那么重要,请查看PyFIM,它为频繁项目集挖掘实现了多种算法。传统上,这些方法将对数据项进行排序。

此问题的一个版本称为" 频繁子序列挖掘",它会考虑到顺序。