如何将元组(子集)列表与列表项进行比较

时间:2018-02-17 18:23:18

标签: python list numpy tuples

我正在研究数据集,这是我到现在所写的内容。

import itertools
import csv
import numpy
def counter(x):
    unique, counts = numpy.unique(result,     return_counts=True)
    list1= numpy.asarray((unique, counts)).T
        return list1
def findsubsets(S,m):
    return list(itertools.combinations(S, m))

sup=input("enter min support\n")
reader = csv.reader(open("test.csv", "rb"), delimiter=",")
X = list(reader)
result = numpy.array(X).astype("string")
print(result)
(m,n)=result.shape

list1=counter(result)
print("deleting items which have less support")
print(list1)
(a,b)=list1.shape
l=[]
for x in range(a):
        a=int(list1[x][1])
        sup1=int(sup)
                if(a>=sup):
            l.append(list1[x][0])
print"after deleting"
print(l)

print("making sets")
o=(findsubsets(l,2))
print(o)
print(X)

列表o有这些元组

[('Beer', 'Bread'), ('Beer', 'Coke'), ('Beer', 'Diaper'), ('Beer', 'Milk'), ('Bread', 'Coke'), ('Bread', 'Diaper'), ('Bread', 'Milk'), ('Coke', 'Diaper'), ('Coke', 'Milk'), ('Diaper', 'Milk')]

并且列表X有

[['Bread', 'Diaper', 'Beer', 'Eggs'], ['Milk', 'Diaper', 'Beer', 'Coke'], ['Bread', 'Milk', 'Diaper', 'Beer'], ['Bread', 'Milk', 'Diaper', 'Coke']]

我想检查list-o的每个元组是否真的在list-X中。 例如beer, bread是list-o的元组 啤酒,面包在list-X中存在2次。我想返回计数2.我怎么能这样做? 编辑: ***********我使用套装********

这样做了
O = [('Beer', 'Bread'), ('Beer', 'Coke'), ('Beer', 'Diaper'), ('Beer', 'Milk'), ('Bread', 'Coke'), ('Bread', 'Diaper'), ('Bread', 'Milk'), ('Coke', 'Diaper'), ('Coke', 'Milk'), ('Diaper', 'Milk')]

X = [['Bread', 'Diaper', 'Beer', 'Eggs'], ['Milk', 'Diaper', 'Beer', 'Coke'], ['Bread', 'Milk', 'Diaper', 'Beer'], ['Bread', 'Milk', 'Diaper', 'Coke']]

dict = defaultdict(int)
for tuple in O:
    for LST in X:
        if set(tuple) <= set(LST):
            dict[tuple] += 1

2 个答案:

答案 0 :(得分:1)

您可以尝试使用

形式的内容
 [(l2[0][i], l2[1][i]) == l1[i] for i in range(len(l1))]

关于你想做的比较,问题有点模糊,但我可以推断(我希望正确)这个想法是把两个列表并排“堆叠”在一起,这样它们看起来可以与元组列表。然后,我假设您要执行相等检查。

这里,执行的等式检查与元组完全匹配。这可能是不正确的。如果是这样,我可以修改我的答案。

我假设您将此写为python问题,但标签在这里很有用。

我提供的代码采用您提供的第二个列表的第一个元素(列表)和您提供的第二个列表(另一个列表)。然后,它根据索引创建一个元组,并将其与元组列表中的匹配元素进行比较。这将返回一个布尔值列表:如果存在相同的元组,则返回true;如果该索引处没有相同的元组,则返回false。列表的长度应该与您提供的元组列表的长度相同。

如果我已正确解释您的问题,则输出符合预期

[False, False, False, False]

当提出这样的问题时,指定您已尝试过的内容以及为什么代码会生成您不期望的输出非常有用。让人们更容易理解问题并提供有用的答案!评论并编辑问题以澄清。

编辑前(2月17日)

编辑后(2月18日)

如果人们最终遇到类似的问题,我会保留上述内容。 您的问题已经过编辑。让我们看看这是否解决了这个问题。

您想知道列表列表中元组元素全部包含的次数。这是套装的完美应用。

lists_to_sets = [set(l) for l in X]
tuples_to_sets = [set(t) for t in o]

现在,您想要计算子集是超集成员的次数,所以:

[sum([t_set.issubset(l_set) for l_set in lists_to_sets]) for t_set in tuples_to_sets]

对于每个元组,这将计算元组中所有元素出现的列表数(是子集)。这给出了预期的输出:

[2, 1, 3, 2, 1, 3, 2, 2, 2, 3]

答案 1 :(得分:1)

collections.defaultdict提供了一种直观的方法:

from collections import defaultdict

lst_o = [('Beer', 'Bread'), ('Beer', 'Coke'), ('Beer', 'Diaper'), ('Beer', 'Milk'), ('Bread', 'Coke'), ('Bread', 'Diaper'), ('Bread', 'Milk'), ('Coke', 'Diaper'), ('Coke', 'Milk'), ('Diaper', 'Milk')]

lst_x = [['Bread', 'Diaper', 'Beer', 'Eggs'], ['Milk', 'Diaper', 'Beer', 'Coke'], ['Bread', 'Milk', 'Diaper', 'Beer'], ['Bread', 'Milk', 'Diaper', 'Coke']]

d = defaultdict(int)

for tup in lst_o:
    for lst in lst_x:
        if set(tup) <= set(lst):
            d[tup] += 1

# defaultdict(int,
#             {('Beer', 'Bread'): 2,
#              ('Beer', 'Coke'): 1,
#              ('Beer', 'Diaper'): 3,
#              ('Beer', 'Milk'): 2,
#              ('Bread', 'Coke'): 1,
#              ('Bread', 'Diaper'): 3,
#              ('Bread', 'Milk'): 2,
#              ('Coke', 'Diaper'): 2,
#              ('Coke', 'Milk'): 2,
#              ('Diaper', 'Milk'): 3})

有关set操作的信息,请参阅set documentation