Python:在列表中交换两个字符串

时间:2017-09-26 07:23:49

标签: python python-3.x list

好的,所以我遇到一个问题,就是在列表中用另一个字符串的一部分交换字符串的一部分。我在这个网站上看到了其他类似的问题,但它们似乎都不适合我。

我们说我有一个清单:

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]

但是,显然这不起作用。

6 个答案:

答案 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)

假设每个句子只包含一个单词(一个句子不能同时包含mathcs),只需创建一个新列表并为其添加新字符串:

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 comprehensionif else条件的简单组合。

答案 5 :(得分:0)

这是一个天真的答案(单词可以是其他单词的子串等),但按照您的方法,我们可以将wawb交换

wa=input....
wb=input....
new = [s.replace(wa,"_").replace(wb,wa).replace("_",wb) for s in sentList]

这样两个句子的转换方式如下:

" cs比数学" - > " _比数学更老了#34; - > " _比cs"更早 - > "数学比cs"