【问题标题】:Python partition and splitPython 分区和拆分
【发布时间】:2024-01-29 03:40:01
【问题描述】:

我想使用 split 和 partition 来拆分带有两个单词的字符串,例如“word1 word2”,并分别打印(使用 for)这些单词,例如:

Partition:
word1
word2

Split:
word1
word2

这是我的代码:

print("Hello World")
name = raw_input("Type your name: ")

train = 1,2
train1 = 1,2
print("Separation with partition: ")
for i in train1:
    print name.partition(" ")

print("Separation with split: ")
for i in train1:
    print name.split(" ")

这正在发生:

Separation with partition: 
('word1', ' ', 'word2')
('word1', ' ', 'word2')

Separation with split: 
['word1', 'word2']
['word1', 'word2']

【问题讨论】:

    标签: python string python-2.7 split partition


    【解决方案1】:

    str.partition 返回三个元素的元组。分区字符串之前的字符串、分区字符串本身和字符串的其余部分。所以,必须这样使用

    first, middle, rest = name.partition(" ")
    print first, rest
    

    要使用str.split,您可以像这样简单地打印分割后的字符串

    print name.split(" ")
    

    但是,当你这样调用它时,如果字符串有多个空格字符,你会得到两个以上的元素。例如

    name = "word1 word2 word3"
    print name.split(" ")          # ['word1', 'word2', 'word3']
    

    如果只想拆分一次,可以指定拆分的次数作为第二个参数,像这样

    name = "word1 word2 word3"
    print name.split(" ", 1)       # ['word1', 'word2 word3']
    

    但是,如果您尝试根据空白字符进行拆分,则不必传递" "。你可以简单地做

    name = "word1 word2 word3"
    print name.split()            # ['word1', 'word2', 'word3']
    

    如果要限制拆分次数,

    name = "word1 word2 word3"
    print name.split(None, 1)     # ['word1', 'word2 word3']
    

    注意:split 中使用None 或不指定参数,会发生这种情况

    引用split documentation

    如果 sep 未指定或为 None,则使用不同的分割算法 应用:连续空白的运行被视为单个 分隔符,结果开头不包含空字符串 如果字符串有前导或尾随空格,则结束。所以, 拆分空字符串或仅包含空格的字符串 使用 None 分隔符返回 []。

    所以,你可以像这样改变你的程序

    print "Partition:"
    first, middle, rest = name.partition(" ")
    for current_string in (first, rest):
        print current_string
    
    print "Split:"
    for current_string in name.split(" "):
        print current_string
    

    或者你可以使用str.join这样的方法

    print "Partition:"
    first, middle, rest = name.partition(" ")
    print "\n".join((first, rest))
    
    print "Split:"
    print "\n".join(name.split())
    

    【讨论】:

      【解决方案2】:

      name.split() 这样的命令会返回一个列表。您可以考虑遍历该列表:

      for i in name.split(" "):
        print i
      

      因为你写的东西,即

      for i in train:
        print name.split(" ")
      

      将执行命令print name.split(" ") 两次(一次用于值i=1,一次用于i=2)。两次它会打印出整个结果:

      ['word1', 'word2']
      ['word1', 'word2']
      

      partition 也会发生类似的情况 - 除了它还返回您拆分的元素。所以在那种情况下你可能想要做

      print name.partition(" ")[0:3:2]
      # or
      print name.partition(" ")[0::2]
      

      返回元素02。或者,您可以这样做

      train = (0, 2,)
      for i in train:
        print name.partition(" ")[i]
      

      在循环中连续两次打印元素 0 和 2。请注意,后一种代码效率较低,因为它计算了两次分区。如果你在乎,你可以写

      train = (0,2,)
      part = name.partition(" ")
      for i in train:
        print part[i]
      

      【讨论】:

      • 嗨弗洛里斯,这行是什么意思,“除了它返回你拆分的元素”? .partition(sep) 返回 firstseptail,不是吗?
      • 是的 - 我的意思是第二个元素是 sep 你可能不想打印。