根据列表在字符串中添加空格

时间:2019-05-25 14:04:29

标签: python list split

我有字符串和数组。 字符串具有与数组相同数量的字母字符。 我需要拆分s来列出每个元素(例如arr)的长度相等。

s = 'Pythonisanprogramminglanguage'

arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
expected == ['Python', 'is', 'an', 'programming', 'language']

12 个答案:

答案 0 :(得分:11)

fetchBookedTimes() { axios.get("http://localhost:8080/api/bookings").then(res => { let temp = {} for (var i = 0; i < res.data.bookings.length; i++) { let date = moment(res.data.bookings[i].date).format("YYYY-MM-DD"), let time = [res.data.bookings[i].bookingTime.substring(0,2)] temp[date] = temp[date] || {date: date, times:[]} temp[date].times.push(time) }); } this.bookedTimes.push(Object.values(temp)) }); } iter结合使用会更清洁:

next

输出:

s = 'Pythonisanprogramminglanguage'
arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
new_s = iter(s)
result = [''.join(next(new_s) for _ in i) for i in arr]

答案 1 :(得分:3)

一种方法是这样做:

s = 'Pythonisanprogramminglanguage'

arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']

expected = []
i = 0
for word in arr:
    expected.append(s[i:i+len(word)])
    i+= len(word)

print(expected)

答案 2 :(得分:3)

使用一个简单的for循环,可以完成以下操作:

s = 'Pythonisanprogramminglanguage'

arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']

start_index = 0
expected = list()
for a in arr:
    expected.append(s[start_index:start_index+len(a)])
    start_index += len(a)

print(expected)

答案 3 :(得分:3)

将来,另一种方法是使用assignment expression(Python 3.8中的新增功能):

s = 'Pythonisanprogramminglanguage'    
arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']

i = 0
expected = [s[i:(i := i+len(word))] for word in arr]

答案 4 :(得分:2)

您可以使用>>> s = 'Pythonisanprogramminglanguage' >>> arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc'] >>> import itertools >>> L = list(itertools.accumulate(map(len, arr))) >>> L [6, 8, 10, 21, 29] 来获取要分割字符串的位置:

zip

现在,如果您将列表本身与>>> list(zip([0]+L, L)) [(0, 6), (6, 8), (8, 10), (10, 21), (21, 29)] 一起使用,则会得到间隔:

>>> [s[i:j] for i,j in zip([0]+L, L)]
['Python', 'is', 'an', 'programming', 'language']

您只需要使用间隔来分割字符串:

{{1}}

答案 5 :(得分:1)

创建一个简单的循环并将单词的长度用作索引:

s = 'Pythonisanprogramminglanguage'    
arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']

ctr = 0
words = []
for x in arr:
  words.append(s[ctr:len(x) + ctr])
  ctr += len(x)

print(words)

# ['Python', 'is', 'an', 'programming', 'language']

答案 6 :(得分:1)

itertools模块具有一个名为accumulate()的功能(在Py 3.2中已添加),以使此操作相对容易:

from itertools import accumulate  # added in Py 3.2


s = 'Pythonisanprogramminglanguage'
arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']

cuts = tuple(accumulate(len(item) for item in arr))
words = [s[i:j] for i, j in zip((0,)+cuts, cuts)]
print(words)  # -> ['Python', 'is', 'an', 'programming', 'language']

答案 7 :(得分:0)

这是另一种方法:

import numpy as np
ar = [0]+list(map(len, arr))
ar = list(np.cumsum(ar))
output_ = [s[i:ar[ar.index(i)+1]] for i in ar[:-1]]

输出

['Python', 'is', 'an', 'programming', 'language']

答案 8 :(得分:0)

另一种方式

a,l = 0,[]
for i in map(len,arr):
    l.append(s[a:a+i])
    a+=i
print (l)
#['Python', 'is', 'an', 'programming', 'language']

答案 9 :(得分:0)

使用iter支持答案。积累的答案是我的最爱。这是使用map而不是列表理解的另一个累积答案

import itertools

s = 'Pythonisanprogramminglanguage'
arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
ticks = itertools.accumulate(map(len, arr[0:]))
words = list(map(lambda i, x: s[i:len(x) + i], (0,) + tuple(ticks), arr))

输出:

['Python', 'is', 'an', 'programming', 'language']

答案 10 :(得分:0)

您可以从s的正面收集切片。

output = []

for word in arr:
    i = len(word)
    chunk, s = s[:i], s[i:]
    output.append(chunk)

print(output)  # -> ['Python', 'is', 'an', 'programming', 'language']

答案 11 :(得分:0)

另一种方法是创建描述所需单词长度的正则表达式模式。您可以将每个字符替换为.(=任何字符),并用()包围单词:

arr = ['lkjhgf', 'zx', 'q', 'ertyuiopakk', 'foacdhlc']

import re

pattern = '(' + ')('.join(re.sub('.', '.', word) for word in arr) + ')'
#=> '(......)(..)(.)(...........)(........)'

如果模式匹配,则可以直接在组中获得所需的单词:

s = 'Pythonisaprogramminglanguage'
re.match(pattern, s).groups()
#=> ('Python', 'is', 'a', 'programming', 'language')