以随机顺序搜索包含特定字母的列表中的字符串
Posted
技术标签:
【中文标题】以随机顺序搜索包含特定字母的列表中的字符串【英文标题】:Search strings in list containing specific letters in random order 【发布时间】:2012-03-15 15:27:28 【问题描述】:我正在用 Python 2.7 编写代码,其中定义了一个字符串列表。然后我想在这个列表的元素中搜索一组字母。这些字母的顺序必须是随机的。即在列表中搜索输入中的每个字母。 我一直在谷歌搜索,但我没有找到解决方案。
这是我得到的:
wordlist = ['mississippi','miss','lake','que']
letters = str(aqk)
for item in wordlist:
if item.find(letters) != -1:
print item
这是一个例子。这里唯一的输出应该是“lake”和“que”,因为这些词包含“a”、“q”和“k”。 我怎样才能重写我的代码才能做到这一点?
提前致谢!
亚历克斯
【问题讨论】:
请为正确的答案投票,并在下面选择您最喜欢的表格。我相信其中大部分都会奏效。 我希望我可以,但我还没有获得足够的声誉来这样做...... 【参考方案1】:for item in wordlist:
for character in letters:
if character in item:
print item
break
【讨论】:
对不起,如果 any 字母中的字符在项目中,则会打印项目; OP 想要测试字母中的 all 字符是否在项目中。 (OP 的例子有同样的错误。) 感谢您的建议! @PaulMcGuire 好吧,这个例子也让我很困惑。以为他的意思是a,q OR k...【参考方案2】:使用set()
会很容易:
wordlist = ['mississippi','miss','lake','que']
letters = set('aqk')
for word in wordlist:
if letters & set(word):
print word
输出:
lake
que
注意:&
运算符在两组之间执行intersection。
【讨论】:
如果词表是固定的并且这个测试是用不同的字母集运行的,预转换词表到词集表(如wordsetlist = map(set, wordlist)
)应该很快就会得到回报。
我想到了另一件事。如果我希望输出是精确的输入,但不一定以相同的方式排列怎么办?【参考方案3】:
这是你的解决方案:
for item in wordlist:
b = False
for c in letters:
b = b | (item.find(c) != -1)
if b:
print item
【讨论】:
item.find(c) != -1
是上个世纪的 so :) - c in item
在现代将是更 Pythonic 的方式;在我的简单测试中,它也快了大约 4 倍。 python -m timeit "'abcdefghijkl'.find('d') != -1"
与 python -m timeit "'d' in 'abcdefghijkl'"
分别给出 0.231 微秒与 0.0602 微秒的时间。此外,您不会在循环中进行任何短路 - 理想情况下,一旦您的搜索失败,就没有必要在 letters
中搜索任何其他字符。不要重新实现all
,而是尝试用b = all(c in item for c in letters)
替换你的代码。
全部正确。因此 - 我没有得到任何支持。我个人也更喜欢其他解决方案。但是,这是我能用我的知识做的最好的事情。
没问题,尽管他发布了一个错误的示例,但您肯定会因实现他想要的 OP 所说而获得积分!但是最近的 Python 版本添加了一些非常好的习语,如 in
、any
、all
和生成器表达式,因此您的代码将折叠成一个非常干净的列表理解,就像来自 @KarlKnechtel 的提交一样。这些新的习惯用法非常强大,值得学习和采用,甚至我敢说,对现有代码进行改造,因为它们的一致性、改进的性能、内置的短路和无混淆的代码缩减。
+1 用于实现 OP 所说的,而不是 OP 所做的!
最后一点 - 如果 letters 是空字符串,您的代码将返回 no 项; set 示例和all
都将返回所有项目。这是一个有趣的边缘案例,我知道在添加 any
和 all
时应该如何进行的讨论很多。简而言之,如果生成器表达式为空,all
将默认为 True; any
将默认为 False。这些是根据逻辑和集合论中的类似结构选择的。【参考方案4】:
[word for word in wordlist if any(letter in word for letter in 'aqk')]
【讨论】:
我想你想要all
,而不是any
。
(我现在看到您和@Ioan 实现了 OP 的示例代码,该代码具有相同的错误 - 但是描述说“在列表中搜索输入中的每个字母。”)【参考方案5】:
使用集合和 in 语法进行检查。
wordlist = ['mississippi','miss','lake','que']
letters = set('aqk')
for word in wordlist:
if word in letters:
print word
【讨论】:
以上是关于以随机顺序搜索包含特定字母的列表中的字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何比较包含非英文字符的 unicode 字符串以按字母顺序排序?
在C ++中按非ASCII顺序的第一个字母对字符串向量进行排序