GVKun编程网logo

如何在Python中找到列表中最短的字符串(如何在python中找到列表中最短的字符串)

9

在本文中,我们将详细介绍如何在Python中找到列表中最短的字符串的各个方面,并为您提供关于如何在python中找到列表中最短的字符串的相关解答,同时,我们也将为您带来关于max()函数如何在pyth

在本文中,我们将详细介绍如何在Python中找到列表中最短的字符串的各个方面,并为您提供关于如何在python中找到列表中最短的字符串的相关解答,同时,我们也将为您带来关于max()函数如何在python中的字符串列表上工作?、Python中最短的数独求解器-如何工作?、python中的字符串到列表转换、在Python中将相同的字符串追加到字符串列表的有用知识。

本文目录一览:

如何在Python中找到列表中最短的字符串(如何在python中找到列表中最短的字符串)

如何在Python中找到列表中最短的字符串(如何在python中找到列表中最短的字符串)

这似乎是一个非常简单的问题,但是我正在寻找一种尚可理解的简短而甜蜜的方法(这不是代码高尔夫)。

给定一个字符串列表,找到最短字符串的最简单方法是什么?

对我来说最明显的方式大致是:

l = [...some strings...]lens = map(l, len)minlen, minind = min(lens)shortest = l[minind]

但这似乎是很多解决此问题的代码(至少在python中)。

答案1

小编典典

min函数具有一个可选参数key,可让您指定一个函数来确定每个项目的“排序值”。我们只是需要将其设置为的len功能来获得最短的价值:

strings = ["some", "example", "words", "that", "i", "am", "fond", "of"]print min(strings, key=len) # prints "i"

max()函数如何在python中的字符串列表上工作?

max()函数如何在python中的字符串列表上工作?

我有一个清单:

list1 = [123,'xyz','zara','abc']
print "Max value element : ",max(list1);

它给:

Max value element : zara

还请说明它如何对字符串列表和数字列表进行比较。

Python中最短的数独求解器-如何工作?

Python中最短的数独求解器-如何工作?

我在玩自己的Sudoku求解器时,遇到以下问题时正在寻找一些指向快速,好设计的指针:

def r(a):i=a.find(''0'');~i or exit(a);[min[(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]forj in range(81)]or r(a[:i]+m+a[i+1:])for m in''%d''%5**18]from sys import*;r(argv[1])

我自己的实现以解决大脑中的问题的方式解决数独问题,但是这种神秘算法如何​​工作?

http://scottkirkwood.blogspot.com/2006/07/shortest-sudoku-solver-in-
python.html

答案1

小编典典

好了,您可以通过修复语法来使事情变得容易一些:

def r(a):  i = a.find(''0'')  ~i or exit(a)  [m in[(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]for j in range(81)] or r(a[:i]+m+a[i+1:])for m in''%d''%5**18]from sys import *r(argv[1])

清理一点:

from sys import exit, argvdef r(a):  i = a.find(''0'')  if i == -1:    exit(a)  for m in ''%d'' % 5**18:    m in[(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3) or a[j] for j in range(81)] or r(a[:i]+m+a[i+1:])r(argv[1])

好的,因此此脚本需要一个命令行参数,并在其上调用函数r。如果该字符串中没有零,则r退出并输出其参数。

(如果传递了另一种类型的对象,则None等于传递零,并且将任何其他对象打印到sys.stderr并导致退出代码为1。特别是sys.exit(“ some
error message”)是一个发生错误时退出程序的快速方法。请参见
http://www.python.org/doc/2.5.2/lib/module-
sys.html)

我猜这意味着零对应于开放空间,并且解决了没有零的难题。然后就是讨厌的递归表达式。

循环很有趣: for m in''%d''%5**18

为什么是5 **
18?原来,结果''%d''%5**18''3814697265625''。这是一个字符串,每个数字至少有1-9个字符,因此它可能试图放置每个数字。实际上,这似乎r(a[:i]+m+a[i+1:])是在做的事情:递归调用r,第一个空格由该字符串中的一个数字填充。但这仅在较早的表达式为false时才会发生。让我们看一下:

m in [(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3) or a[j] for j in range(81)]

因此,仅当m不在该怪物列表中时,才进行放置。每个元素可以是一个数字(如果第一个表达式为非零)或一个字符(如果第一个表达式为零)。如果m作为字符出现,则m被排除为可能的替换,只有在第一个表达式为零时才可能发生。表达式何时为零?

它有三部分相乘:

  • (i-j)%9 如果i和j相隔9的倍数,即同一列,则为零。
  • (i/9^j/9) 如果i / 9 == j / 9,则为零,即同一行。
  • (i/27^j/27|i%9/3^j%9/3) 如果两个都为零,则为零:
    • i/27^j^27 如果i / 27 == j / 27,则为零,即相同的三行块
    • i%9/3^j%9/3 如果i%9/3 == j%9/3,则为零,即同一列的三列

如果这三个部分中的任何一个为零,则整个表达式为零。换句话说,如果i和j共享行,列或3x3块,则j的值不能用作i处空白的候选对象。啊哈!

from sys import exit, argvdef r(a):  i = a.find(''0'')  if i == -1:    exit(a)  for m in ''3814697265625'':    okay = True    for j in range(81):      if (i-j)%9 == 0 or (i/9 == j/9) or (i/27 == j/27 and i%9/3 == j%9/3):        if a[j] == m:          okay = False          break    if okay:      # At this point, m is not excluded by any row, column, or block, so let''s place it and recurse      r(a[:i]+m+a[i+1:])r(argv[1])

请注意,如果没有一个放置成功,r将返回并返回到可以选择其他位置的位置,因此这是基本的深度优先算法。

不使用任何启发式方法,效率不是特别高。我从Wikipedia(http://en.wikipedia.org/wiki/Sudoku)看了这个难题:

$ time python sudoku.py 530070000600195000098000060800060003400803001700020006060000280000419005000080079534678912672195348198342567859761423426853791713924856961537284287419635345286179real    0m47.881suser    0m47.223ssys 0m0.137s

附录:我如何将其重写为维护程序员(此版本的速度提高了93倍:)

import sysdef same_row(i,j): return (i/9 == j/9)def same_col(i,j): return (i-j) % 9 == 0def same_block(i,j): return (i/27 == j/27 and i%9/3 == j%9/3)def r(a):  i = a.find(''0'')  if i == -1:    sys.exit(a)  excluded_numbers = set()  for j in range(81):    if same_row(i,j) or same_col(i,j) or same_block(i,j):      excluded_numbers.add(a[j])  for m in ''123456789'':    if m not in excluded_numbers:      # At this point, m is not excluded by any row, column, or block, so let''s place it and recurse      r(a[:i]+m+a[i+1:])if __name__ == ''__main__'':  if len(sys.argv) == 2 and len(sys.argv[1]) == 81:    r(sys.argv[1])  else:    print ''Usage: python sudoku.py puzzle''    print ''  where puzzle is an 81 character string representing the puzzle read left-to-right, top-to-bottom, and 0 is a blank''

python中的字符串到列表转换

python中的字符串到列表转换

我有绳子。

s = '1989,1990'

我想使用python将其转换为列表,我希望输出为,

s = ['1989','1990']

有没有最快的一种班轮方式呢?

在Python中将相同的字符串追加到字符串列表

在Python中将相同的字符串追加到字符串列表

我正在尝试采用一个字符串,并将其附加到列表中包含的每个字符串中,然后使用完成的字符串创建一个新列表。例:

list1 = [''foo'', ''fob'', ''faz'', ''funk'']string = ''bar''*magic*list2 = [''foobar'', ''fobbar'', ''fazbar'', ''funkbar'']

我尝试了循环,并尝试了列表理解,但这是垃圾。一如既往的任何帮助,不胜感激。

答案1

小编典典

最简单的方法是使用列表理解:

[s + mystring for s in mylist]

请注意,我避免使用内置名称,list因为那样会掩盖或隐藏内置名称,这非常不好。

另外,如果您实际上不需要列表,而只需要一个迭代器,则生成器表达式可能会更高效(尽管在短列表中这并不重要):

(s + mystring for s in mylist)

这些功能非常强大,灵活且简洁。每个好的python程序员都应该学会使用它们。

关于如何在Python中找到列表中最短的字符串如何在python中找到列表中最短的字符串的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于max()函数如何在python中的字符串列表上工作?、Python中最短的数独求解器-如何工作?、python中的字符串到列表转换、在Python中将相同的字符串追加到字符串列表等相关知识的信息别忘了在本站进行查找喔。

本文标签: