【问题标题】:Python - Creating a function which checks for new elements in lists of a listPython - 创建一个检查列表列表中的新元素的函数
【发布时间】:2020-03-29 22:08:04
【问题描述】:

我很困惑如何创建一个函数来检查列表中的子列表并检查这些子列表在整个列表本身中是否具有唯一元素。

alphabet_1 = [['a', 'b', 'c'], ['a', 'c', 'd'], ['a', 'e', 'f',], ['a', 'b', 'c']]

alphabet_2 = [['a', 'b', 'c'], ['a', 'b', 'c']

这些只是示例。

对于alphabet_1,由于第二个子列表在整个列表中至少有一个新元素,它转到下一个子列表,然后下一个失败,因为第四个子列表在整个列表中没有新元素,它停止。然后它计算通过 aka 4(直到停止)有多少子列表过去了

对于alphabet_2,由于第二个子列表对整个列表有0 new,所以它停止了。这会通过 2(直到停止)。

任何帮助将不胜感激!

【问题讨论】:

  • 假设alphabet_1是4,alphabet_2是2的预期输出。

标签: python python-3.x list


【解决方案1】:
def check_alphabet(a):
    i = 0
    curr_a = []
    for l in a:
        upd_a = list(set(curr_a + l))
        if len(upd_a) == len(curr_a):
            break
        i += 1
        curr_a = upd_a
    return i, curr_a

【讨论】:

  • 感谢您的回复,您知道如何格式化代码,以便函数停止计数需要两次失败。例如,第二个子列表和第三个子列表没有任何新元素,则函数停止并计数 4。
  • 而不是break添加一个计数器然后检查计数器;在循环之前初始化为 0,而不是在第一个 if 之后添加一个,而不是 break 添加一个,然后检查此计数器是否已达到阈值并在那里中断
【解决方案2】:

绝对不是专家,也不熟悉python。

只是一个想法:将“超级列表”中已经出现的每个元素保存到另一个列表中。

您所要做的就是根据新列表中的已出现项目检查每个元素。一旦一个子列表的“新项目(尚未出现在超级列表中的项目”)的计数 = 0,您就会停止检查,而是计算您经过的子列表的数量。

过程:

  1. 创建发生的项目列表(字符串)
  2. 创建checkedLists变量(整数)
  3. 为您检查的每个列表创建 uniqueItems(整数)
  4. 检查您的超级列表中的每个元素并将该项目添加到发生的项目中,如果它尚未成为列表的一部分,则设置 uniqueItems+1
  5. 如果您检查了每个子列表的最后一项,则必须检查(此列表的)uniqueItems 是否 > 0。才能继续下一个子列表。如果 uniqueItems (对于这个列表)确实 > 0 :设置 checkedLists+1 如果 uniqueItems = 0 您的算法应该停止并继续第 6 点
  6. 您可以只返回checkedLists 以便在一个子列表没有唯一项之前检查子列表的数量。

我希望这对你有任何意义。刚看到这个帖子,觉得我能帮上忙。

【讨论】:

  • 感谢您的帮助,我会尝试您的流程!
【解决方案3】:

您可以使用itertools.takewhileitertools.accumulate

from itertools import accumulate
from itertools import takewhile

alphabet_1 = [['a', 'b', 'c'], ['a', 'c', 'd'], ['a', 'e', 'f',], ['a', 'b', 'c'], ['a', 'b', 'c']]
alphabet_2 = [['a', 'b', 'c'], ['a', 'b', 'c']]



def evaluate(l1, l2):
    s = set(l2)
    if s.issubset(l1):
        return False

    return s | set(l1)

def check(alphabet_):
    l = len(list(takewhile(bool, accumulate(alphabet_ , evaluate)))) + 1 
    return  min(l, len(alphabet_))

print(check(alphabet_1))
print(check(alphabet_2))

输出:

4
2

元素被传递 throw itertools.acumulate 其中evaluate 函数正在检查每个子列表是否有新元素,当发现子列表没有任何新元素时它返回False,此时itertools.takewile 将停止迭代,然后返回最终长度

【讨论】:

  • 感谢您的回复,我对这些工具还很陌生,所以我会玩弄它们!
  • 如果存在需要两个没有新元素的失败子列表才能停止迭代的情况,您将在哪里更改代码?
  • 你将不得不在你的字母表上使用枚举,但我会说这是另一个问题的情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多