Python: 是否有类似于BASIC中的mid、right和left函数的等效函数?

67

我想做类似这样的事情:

>>> mystring = "foo"
>>> print(mid(mystring))

帮帮我!


6
BASICиҜӯиЁҖдёӯзҡ„midжҳҜд»Җд№Ҳж„ҸжҖқпјҹ - mgilson
4
我猜想 midleftright 需要额外的参数,对吧? - alecxe
他们在BASIC中需要额外的参数。左侧和右侧各两个,Mid 要求两个或三个参数。 - Bill Hileman
8个回答

131
def left(s, amount):
    return s[:amount]

def right(s, amount):
    return s[-amount:]

def mid(s, offset, amount):
    return s[offset:offset+amount]

7
小心使用 right 函数。'asdf'[-0:] == 'asdf',而不是 '' - user2357112
@user2357112 当然,你是正确的。这段代码只是为了说明Python和Basic中的函数可能对应的示例目的而提供的。 - Andy W
不要忘记:如果 amount 大于字符串 s 的字符数,left() 和 right() 可能会返回错误。 - user96931
mid() 函数必须被下面的答案所替换。 - user96931

35

11

谢谢Andy W!

我发现mid()函数并没有像我期望的那样工作,所以我做了以下修改:

def mid(s, offset, amount):
    return s[offset-1:offset+amount-1]

我进行了以下测试:
print('[1]23', mid('123', 1, 1))
print('1[2]3', mid('123', 2, 1))
print('12[3]', mid('123', 3, 1))
print('[12]3', mid('123', 1, 2))
print('1[23]', mid('123', 2, 2))

这导致了:
[1]23 1
1[2]3 2
12[3] 3
[12]3 12
1[23] 23

这正是我所期望的。原始的mid()代码产生了以下结果:

[1]23 2
1[2]3 3
12[3] 
[12]3 23
1[23] 3

但是left()和right()函数运行正常。谢谢。


5
您可以使用此方法,它将起到相应的作用。
thadari=[1,2,3,4,5,6]

#Front Two(Left)
print(thadari[:2])
[1,2]

#Last Two(Right)# edited
print(thadari[-2:])
[5,6]

#mid
mid = len(thadari) //2

lefthalf = thadari[:mid]
[1,2,3]
righthalf = thadari[mid:]
[4,5,6]

希望这对您有所帮助


1
我得到 [1, 2, 3, 4] 作为 print(thadari[:-2]) 的输出。 - James G

2

这是安迪的解决方案。我只是解决了User2357112的问题,并给变量起了有意义的名称。我是Python新手,更喜欢这些函数。

def left(aString, howMany):
    if howMany <1:
        return ''
    else:
        return aString[:howMany]

def right(aString, howMany):
    if howMany <1:
        return ''
    else:
        return aString[-howMany:]

def mid(aString, startChar, howMany):
    if howMany < 1:
        return ''
    else:
        return aString[startChar:startChar+howMany]

1
在Python中有内置函数可用于“右侧”和“左侧”,如果您正在寻找布尔结果。
str = "this_is_a_test"
left = str.startswith("this")
print(left)
> True

right = str.endswith("test")
print(right)
> True

1
在基本编程中,“right”和“left”返回的是字符串的一部分,而不是布尔值。 - Caltor

0

这些对于从字符串中读取左/右“n”个字符非常有效,但是至少在BBC BASIC中,LEFT$()RIGHT$()函数也允许您更改左/右“n”个字符...

E.g.:

10 a$="00000"
20 RIGHT$(a$,3)="ABC"
30 PRINT a$

会产生:

00ABC

编辑:在写这篇文章之后,我已经想出了自己的解决方案...

def left(s, amount = 1, substring = ""):
    if (substring == ""):
        return s[:amount]
    else:
        if (len(substring) > amount):
            substring = substring[:amount]
        return substring + s[:-amount]

def right(s, amount = 1, substring = ""):
    if (substring == ""):
        return s[-amount:]
    else:
        if (len(substring) > amount):
            substring = substring[:amount]
        return s[:-amount] + substring

要返回n个字符,你需要调用:
substring = left(string,<n>)

如果未提供,则默认为1。right()同样适用于此。

要更改字符串的左侧或右侧n个字符,您需要调用:

newstring = left(string,<n>,substring)

这将获取子字符串的前n个字符,并覆盖字符串的前n个字符,将结果返回到newstring中。right()函数同理。


这实际上是一条评论,而不是一个答案。有了更多的声望,你就可以发表评论了(//stackoverflow.com/privileges/comment)。请只使用回答来发布真正的答案。 - Bowdzone

0

根据上面的评论,似乎可以重构Right()函数以更好地处理错误。以下代码看起来可行:

def right(s, amount):
    if s == None:
        return None
    elif amount == None:
        return None # Or throw a missing argument error
    s = str(s)
    if amount > len(s):
        return s
    elif amount == 0:
        return ""
    else:
        return s[-amount:]

print(right("egg",2))
print(right(None, 2))
print(right("egg", None))
print(right("egg", 5))
print("a" + right("egg", 0) + "b")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接