【问题标题】:Return how many times ALL elements in list X appear in the sublists of a list of lists D only if ALL elements in another list Y do not appear仅当另一个列表 Y 中的所有元素不出现时,才返回列表 X 中的所有元素出现在列表 D 的子列表中的次数
【发布时间】:2020-10-16 22:36:52
【问题描述】:

我有以下数据集:

D=[[A,B,D,E],[B,C,E],[A,B,D,E],[A,B,C,E],[A,B,C,D,E],[B,C,D]]

而且我需要找到一种方法,仅当另一个元素 Y(即 sup_X¬Y)没有出现时,才能获取元素 X 在列表中出现的次数。

例如,sup_E¬C,表示E 出现在列表中而C 没有出现的次数。在这种情况下,这个条件在D[0]D[2]这两个位置上都满足,所以答案应该是2。

在另一个示例中,sup_E¬AD 表示E 出现在列表中而AD 没有出现的次数。这个条件在D[1]位置满足,所以答案应该是1

我有这段代码可以让我找到元素 X 出现的次数,

sup_X=(sum(1 for x in D if set(X) <= set(x) ))

例如,元素 ['A','B'] 在数据集中出现 4 次,在 D[0],D[2],D[3],D[4]

并尝试在哪里应用相同的逻辑,但我无法做到

【问题讨论】:

  • 你能测试我提供的单线吗?另外,我相信这里有一个错字:“在另一个例子中,sup_E¬AD 表示 E 出现在列表中的次数,而 AB 没有出现。”我想你的意思是说:“......其中AD 没有出现。”我正在编辑,但如果我不正确,请随时回滚。
  • 我也将标题改为Return how many times ALL elements in list X appear in the sublists of a list of lists D only if ALL elements in another list Y do not appear,以更好地反映问题。请记住,列表的长度可以为 1,即包含一个字符串,但我认为如果 X 和 Y 都可能包含多个元素,我认为您需要标准化为列表而不是列表与字符串。跨度>

标签: python python-3.x list python-2.7 variables


【解决方案1】:

我会先隔离符合条件的子列表:

>>> D=[['A','B','D','E'],['B','C','E'],['A','B','D','E'],['A','B','C','E'],['A','B','C','D','E'],['B','C','D']]
>>> res = [i for i in D if 'E' in i and 'C' not in i]
>>> len(res)
2

如果您只关心总和,那么您可以这样做:

>>> res = sum(1 for i in D if 'E' in i and 'C' not in i)
>>> res
2

更新 1:基于评论(第二个示例)

我认为在 1-liner 中做的事情有点太复杂了,那么以下内容呢:

>>> def my_filter(appear, not_appear):
...     res = []
...     for lst in D:
...         is_ok = True
...         for ap in appear:
...             if ap not in lst:
...                 is_ok = False
...         for nap in not_appear:
...             if nap in lst:
...                 is_ok = False
...         if is_ok:
...             res.append(lst)
...     
...     return res
... 
>>> res = my_filter({'E'}, {'A', 'D'})
>>> len(res)
1
>>> res
[['B', 'C', 'E']]

同样,如果您只对 count/sum 感兴趣,您可以将 res 修改为 int 和 res += 1 而不是 append

更新 2:

以下是更紧凑的版本,但我觉得很难阅读,我不喜欢它:

>>> appear = {'E'}
>>> not_appear = {'A', 'D'}
>>> res = [
    lst
    for lst in D 
    if (
        all(map(lambda x: x in lst, appear))
        and all(map(lambda x: x not in lst, not_appear))
    )
]
>>> len(res)
1

【讨论】:

  • 但是如果我需要查找多个元素怎么办?就像我的第二个例子一样
【解决方案2】:
lst=[['A','B','D','E'],['B','C','E'],['A','B','D','E'],['A','B','C','E'],['A','B','C','D','E'],['B','C','D']]

X='E'
Y='C'

print( sum(X in l and Y not in l for l in lst) )

打印:

2

【讨论】:

    【解决方案3】:

    我相信return 行是您正在寻找的单行列表理解逻辑。请注意,如果 x 和/或 y 可以是列表,您应该将 xy 变量标准化为列表格式,即使列表仅包含一个字符串:

    D=[['A','B','D','E'],['B','C','E'],['A','B','D','E'],['A','B','C','E'],['A','B','C','D','E'],['B','C','D']]
    
    def f(l, x, y):
        return sum([1 for sl in l if all([True if x1 in sl and y1 not in sl
                                          else False for x1 in x for y1 in y])])
    
    
    print(f(D,['E'],['C']))
    print(f(D,['E'],['B','D']))
    print(f(D,['E'],['A','D']))
    
    2
    0
    1
    

    【讨论】:

      猜你喜欢
      • 2016-05-06
      • 1970-01-01
      • 2020-11-18
      • 2011-05-11
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多