我尝试了这个解决方案: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
等等。
答案 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)
我理解这个问题的方式,你问的是:给定一组字符串,返回任何这些字符串出现的列表数。
因此,对于list4
和k=2
,我们有'b2'
和'a1'
。两者都出现在list1
中,因此我们得到一个列表。不会显示在list2
中,因此不会添加1.它们都会显示在list3
和list5
中,总共会生成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=3
和list4
没有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,它为频繁项目集挖掘实现了多种算法。传统上,这些方法将对数据项进行排序。
此问题的一个版本称为" 频繁子序列挖掘",它会考虑到顺序。