【问题标题】:python - check if word is in list full of strings and if there is print the words in an another listpython - 检查单词是否在充满字符串的列表中,以及是否在另一个列表中打印单词
【发布时间】:2020-02-26 20:05:18
【问题描述】:

所以基本上它会是这样的:

MyList=["Monkey","Phone","Metro","Boom","Feet"]

假设我的输入是 m 所以 BoomMonkey 和 Metro 会像这样放在一个列表中

output >> ["Monkey","Metro","Feet"]

如果我将输入设为 f,那么输出将是

output >> ["Feet"]

我的问题是如何将其放入 def 中?这就是我想出来的

def Find(word,MyList):
    MyList2=[]
    count=0
    for i in MyList:
        count+=1     
        if i[count] == MyList2:     ##(at first i did if i[0:10])
            for x in range(1):
                MyList2.append(i)
    print(MyList2)

然后在某个地方应该有

word=input("Word, please.")

然后

Find(word,MyList)

提前致谢!

【问题讨论】:

  • 输入字母表可以出现在 mylist 中单词的任何索引处,对吗?

标签: python python-3.x list


【解决方案1】:

试试这个:

def find_words(input_char, my_list):
    ret_list = []
    for i in my_list:
        if input_char.lower() in i.lower():
            ret_list.append(i)
    return ret_list

MyList=["Monkey","Phone","Metro","Boom","Feet"]

input_char=input("Input a character :").strip()  # get a character and strip spaces if any.

find_words(input_char, MyList)  # call the function with arguments

样本输入“M:”的输出:

Input a character :>? "M"
>>> ['Monkey', 'Metro', 'Boom']

【讨论】:

    【解决方案2】:

    (几乎)一个班轮:

    >>> MyList=["Monkey","Phone","Metro","Boom","Feet"]
    >>> target = input("Input string: ")
    Input string: Ph
    >>> print([i for i in MyList if target.lower() in i.lower()])
    ['Phone']
    

    通常在 Python 中你不想玩索引,迭代器是要走的路。 in 关键字检查子字符串,因此无论您只提供一个字符还是一个完整的字符串,它都可以工作(即,如果您输入 Ph,您将得到一个仅包含 Phone 的列表)

    【讨论】:

    • 你能发布输出吗?我认为它不会直接且合乎逻辑地回答问题,它会要求输入n 次,但想了解您的方法
    • dont play with indexes 是什么意思?解释一下代码中的迭代器在哪里?请不要在这里乱说。
    • 不要使用索引我是指通过语法Mylist[index] 的列表/字符串的元素。 Python 已经有工具可以自动化大多数你能想到的任务,包括这个(在这种情况下就是in 关键字)。迭代器是指 for item in list 语法,而不是原始问题中使用变量计数完成的 C 样式索引。
    【解决方案3】:

    取决于您希望搜索的效率。加入另一种方法来构建这样的字典

    from collections import defaultdict
    d = defaultdict(set)
    for i in MyList:
        chars = set(i)
        for c in chars:
            d[c].add(i)
    

    现在,你的字典看起来像这样

    defaultdict(set,
                {'o': {'Boom', 'Metro', 'Monkey', 'Phone'},
                 'k': {'Monkey'},
                 'e': {'Feet', 'Metro', 'Monkey', 'Phone'},
                 'M': {'Metro', 'Monkey'},
                 'y': {'Monkey'},
                 'n': {'Monkey', 'Phone'},
                 'h': {'Phone'},
                 'P': {'Phone'},
                 't': {'Feet', 'Metro'},
                 'r': {'Metro'},
                 'm': {'Boom'},
                 'B': {'Boom'},
                 'F': {'Feet'}})
    

    现在,您可以简单地在复杂度为 O(1) 的 dict 中搜索

    d[your_input_char]
    

    【讨论】:

    • 随着列表变大,这将导致大量内存开销。
    • 先阅读我的第一个声明。谢谢。它始终是时间和空间复杂性之间的权衡。您需要决定哪种解决方案最适合您。它在空间复杂度方面表现不佳,但在搜索方面表现良好。在构建搜索系统时,我更关心速度而不是空间。
    • 我知道你在这里得到 O(1) 个结果,但这是以 O(A*N*S) 内存开销为代价的,A 是字母的大小,N 是数字列表中的元素个数,S 是每个元素的平均大小。我觉得不值得。
    • 再次在这里抛出想法。 OP 应该决定哪种解决方案最适合他。我仍然不相信反对票,但无论什么让你开心。干杯
    • @Cal 字典的空间复杂度是O(A*N),因为字典最多有 A 个键,每个键有一个包含最多 N 个字符串引用的集合。一个引用占用O(1)空间,并且字符串已经存在于内存中;但是如果你也想计算字符串,那么总数是O((A+S)*N),仍然小于O(A*N*S),并且相当高估,因为当S
    【解决方案4】:

    以下是如何使用列表推导式:

    def Find(letter, MyList):
        print([word for word in MyList if letter.lower() in word.lower()])
    
    Find('m', ["Monkey","Phone","Metro","Boom","Feet"])
    

    输出:

    ['Monkey', 'Metro', 'Boom']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-17
      • 2017-02-28
      • 1970-01-01
      • 2011-07-16
      • 2017-10-16
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多