好的,所以我遇到一个问题,就是在列表中用另一个字符串的一部分交换字符串的一部分。我在这个网站上看到了其他类似的问题,但它们似乎都不适合我。
我们说我有一个清单:
sentList = ['i like math', 'i am a cs expert']
现在我想切换数学'与&#c;'使用由用户输入确定的变量。
currentWord = input('Swap word: ')
newWord = input('with word: ')
所以,现在我将如何交换这两个,以便我的列表返回以下内容:
sentList = ['i like cs', 'i am a math expert']
一如既往,感谢您的帮助。我想我可以使用替换功能,但不知道如何。我想它看起来像这样:
sentList = [sentListN.replace(currentWord, newWord) for sentListN in sentList]
但是,显然这不起作用。
答案 0 :(得分:1)
以下代码有效。我使用word1(currentWord)和word2(newWord)变量作为用户输入
sentList = ['i like math', 'i am a cs expert']
word1 = 'math'
word2 = 'cs'
assert word1, word2 in sentList
sentList = [s.replace(word1, word2) if word1 in s
else s.replace(word2, word1) if word2 in s
else s for s in sentList]
如果我们将其分解为步骤,它看起来像
for i, s in enumerate(sentList):
if word1 in s:
sentList[i] = s.replace(word1, word2)
elif word2 in s:
sentList[i] = s.replace(word2, word1)
答案 1 :(得分:1)
您可以通过简单的交换功能实现它。不需要使代码复杂化:))
def swap(str, x, y):
words = []
for w in str.split():
if w == x:
words.append(y)
elif w == y:
words.append(x)
else:
words.append(w)
return ' '.join(words)
if __name__ == '__main__':
sentList = ['i like math', 'i am a cs expert']
word1 = 'math'
word2 = 'cs'
new_list = [swap(x, word1, word2) for x in sentList]
print(new_list)
答案 2 :(得分:1)
使用list comprehension
的单个班轮。
[sent.replace(currentWord,newWord) if sent.find(currentWord)>=0 else sent.replace(newWord,currentWord) for sent in sentList]
所以,
IN: sentList = ['i like math', 'i am a cs expert']
IN : currentWord = "math"
IN : newWord = "cs"
OUT : ['i like cs', 'i am a math expert']
在此处,if sent.find('math')>=0
会查明该字符串是否属于'math'
,如果是,则将其替换为'cs'
,否则将'cs'
替换为'math'
。如果字符串既不包含,也会打印原始字符串,因为只有找到子字符串才能替换。
编辑:正如@Rawing所指出的,上面的代码中有一些错误。所以这里是处理所有案例的新代码。
我已经使用re.sub
来处理单词的替换,替换算法就是如何交换两个变量,比如x
和{{1}我们引入一个临时变量y
来帮助交换:t
。选择这种方法是因为我们必须同时进行多次替换。
t = x; x = y; y = t
所以这次在一个更大的测试案例中,我们得到:
from re import sub
for s in sentList:
#replace 'math' with '%math_temp%' in s (here '%math_temp%' is a dummy placeholder that we need to later substitute with 'cs')
temp1 = sub(r'\bmath\b','%math_temp%' , s)
#replace 'cs' with 'math' in temp1
temp2 = sub(r'\bcs\b','math', temp1)
#replace '%math_temp%' with 'cs' in temp2
s = sub('%math_temp%','cs', temp2)
print(s)
答案 3 :(得分:0)
假设每个句子只包含一个单词(一个句子不能同时包含math
和cs
),只需创建一个新列表并为其添加新字符串:
newSentList = []
for sent in sentList:
assert(currentWord in sent != newWord in sent)
if currentWord in sent:
newSentList.append(sent.replace(currentWord, newWord))
else:
newSentList.append(sent.replace(newWord, currentWord))
答案 4 :(得分:0)
你可以这样试试,
In [20]: currentWord = 'cs'
In [21]: newWord = 'math'
In [22]: [i.replace(currentWord,newWord) if currentWord in i else i.replace(newWord,currentWord) if newWord in i else i for i in sentList]
Out[22]: ['i like cs', 'i am a math expert']
这是list comprehension
和if else
条件的简单组合。
答案 5 :(得分:0)
这是一个天真的答案(单词可以是其他单词的子串等),但按照您的方法,我们可以将wa
与wb
交换
wa=input....
wb=input....
new = [s.replace(wa,"_").replace(wb,wa).replace("_",wb) for s in sentList]
这样两个句子的转换方式如下:
" cs比数学" - > " _比数学更老了#34; - > " _比cs"更早 - > "数学比cs"
早