【问题标题】:How can I compare list of tuples (subsets) with a list items如何将元组(子集)列表与列表项进行比较
【发布时间】:2018-07-28 09:48:22
【问题描述】:

我正在研究数据集,这是我到现在为止写的。

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 的元组 啤酒,面包在列表-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

【问题讨论】:

  • 什么语言,python“比较”究竟如何?你尝试过什么,它到底有什么问题?
  • 是的,它是 python。请看看我现在已经编辑了这个问题。 @jonrsharpe

标签: python list numpy tuples


【解决方案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]

【讨论】:

  • 我想我已经回答了你的问题。请点赞并接受
【解决方案2】:

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

【讨论】:

  • 我不知道这种方法。非常酷。感谢分享!特别是,我没有意识到
  • @PeterBarrettBryan,没问题,我添加了可能对您有所帮助的文档链接。
猜你喜欢
  • 2021-01-23
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 2021-05-18
相关资源
最近更新 更多