设置列表上的操作

2024-09-24 08:35:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我的想法是有一个由4个子串组成的字符串'four'。我正在尝试从列表“folder”中查找只与4个子字符串(子集)匹配的单词。所以'paul'会匹配,但'pauls'不会匹配。我唯一的问题是'set'不能处理相同的字符串。下面的代码将打印“aa”,但字符串“four”中只有一个a。是否有“issubset”操作可用于列表?你知道吗

four = "laup"

four = set(four)

folder = ["paul","joshua","other","asdf","joshua","aa","hello"]

for word in folder:
    wordstrings = set(word)
    if wordstrings.issubset(four):
            print(word)

Tags: 字符串列表folder单词子集wordaafour
2条回答

据我所知,列表没有像子集那样的函数。集合总是去除重复项,因为不需要知道值是否重复就可以知道它存在于集合中。这里的问题是,当您在for循环中迭代时,word='aa'变成wordstrings={'a'},这是四的子集。你必须使用set吗?我只要一个计数器,不把单词转换成集合。你知道吗

     four = list(four) #keep it as a workable list instead?

     for word in folder:
          n = 0
          for letter in word:
              if four.count(letter) != word.count(letter):
        # iterating through and counting if the letter is not in 
        # both four and word in equal quantities 
                    n += 1
          if n == 0:
              print(word)

如果要匹配相同的字符(包括重复字符),请使用Counter dict来计算每个单词中的字符数:

four = "laup"
from collections import Counter
four = Counter(four)

folder = ["paul","joshua","other","asdf","joshua","aa","hello"]

for word in folder:
    wordstrings = Counter(word)
    if not wordstrings - four:
            print(word)

如果你在A-B之后得到一个空的计数器,这意味着A中的所有字母在A中出现的次数至少与在B中出现的次数相同:

In [14]: Counter("foos") - Counter("foo")
Out[14]: Counter({'s': 1})

In [15]: Counter("foo") - Counter("foos")
Out[15]: Counter()

In [16]: Counter("pauls") - Counter("paul")
Out[16]: Counter({'s': 1})

In [17]: Counter("paul") - Counter("paul")
Out[17]: Counter()

您还可以使用all确保至少有四个应用程序中出现wordstrings中的字符,如果其中一个没有出现,则会短路:

for word in folder:
    wordstrings = Counter(word)
    if all(wordstrings[k] - four[k] <= 0 for k in wordstrings):
            print(word)

因为所有元素都是唯一的,所以重复的字符将被计为1。你知道吗

相关问题 更多 >