Python-多次替换一个单词

Python-多次替换一个单词,python,Python,问题: 我有一个例子,每次句子中的单词发生变化时,我都需要用dc替换句子中的单词。这句话是: Sweet Bad No Long Yes Bike No Yes 在接下来的几次中,句子将不断变为: Sweet Bad No Long Yes Bike Yes No Sweet Bad No Short Yes Car Yes No 因此,输出应该如下所示: Sweet Bad No No dc Yes dc dc dc 我想用dc替换从第一句到下一句的第一个变更实例。我写了一段代码,但似乎不对。

问题: 我有一个例子,每次句子中的单词发生变化时,我都需要用
dc
替换句子中的单词。这句话是:

Sweet Bad No Long Yes Bike No Yes

在接下来的几次中,句子将不断变为:

Sweet Bad No Long Yes Bike Yes No

Sweet Bad No Short Yes Car Yes No

因此,输出应该如下所示:

Sweet Bad No No dc Yes dc dc dc

我想用
dc
替换从第一句到下一句的第一个变更实例。我写了一段代码,但似乎不对。我哪里做错了

 dont_care = "dc"
 hyp_curr = []
 hyp_next = []

 def create_hypothesis(stVal):
      splitVal = stVal.split()
      global hyp_curr
      global hyp_next

      if not hyp_curr: 
           hyp_curr = (' '.join(w for w in splitVal if w not in hyp_curr))
           return hyp_curr
      else: 
           hyp_next = splitVal
           print hyp_curr
           print hyp_next

           for wordc in hyp_curr.split():
                for wordn in hyp_next:
                     if hash(wordc) != hash(wordn):
                          hyp_curr = hyp_curr.replace(wordn,dont_care)
                          return hyp_curr
或:

也许是这样

#!/usr/local/cpython-3.3/bin/python

import pprint

def rep_dc(list_):
    result = []
    for sublist1, sublist2 in zip(list_[:-1], list_[1:]):
        assert len(sublist1) == len(sublist2)
    for tuple_ in zip(*list_):
        set_ = set(tuple_)
        if len(set_) > 1:
            result.append('dc')
        else:
            result.append(tuple_[0])
    return result

def main():
    list1 = 'Sweet Bad No No Long Yes Bike No Yes'.split()
    list2 = 'Sweet Bad No No Long Yes Bike Yes No'.split()
    list3 = 'Sweet Bad No No Short Yes Car Yes No'.split()

    master_list = [ list1, list2, list3 ]
    pprint.pprint(master_list)
    result = rep_dc(master_list)
    print(result)
    result_string = ' '.join(result)
    print(result_string)

main()

FWIW,您将hyp_curr初始化为列表,但将其用作字符串,这令人困惑。你似乎也不需要hyp_next来实现全球化。你也不需要hyp_curr是全球性的-你最好每次都把它作为第二个参数传递出去。@GreenAsJade是的,我正要这么做。:)回答得很好。我以前没想过用拉链!如果上面提到的程序中有不止一行这样的代码,您可能会在列表中添加所有行,比如说
lAll
。然后可以使用
zip(map(lambda m:m.split(),lAll))
压缩列表中的所有元素。最后,可以使用
lambda x:x[1::==x[:-1]
检查列表的所有元素是否相同。
>>> [x[0]==x[1] and x[0] or 'dc' for x in zip(s.split(), s1.split())]
['Sweet', 'Bad', 'No', 'No', 'Long', 'Yes', 'Bike', 'dc', 'dc']
#!/usr/local/cpython-3.3/bin/python

import pprint

def rep_dc(list_):
    result = []
    for sublist1, sublist2 in zip(list_[:-1], list_[1:]):
        assert len(sublist1) == len(sublist2)
    for tuple_ in zip(*list_):
        set_ = set(tuple_)
        if len(set_) > 1:
            result.append('dc')
        else:
            result.append(tuple_[0])
    return result

def main():
    list1 = 'Sweet Bad No No Long Yes Bike No Yes'.split()
    list2 = 'Sweet Bad No No Long Yes Bike Yes No'.split()
    list3 = 'Sweet Bad No No Short Yes Car Yes No'.split()

    master_list = [ list1, list2, list3 ]
    pprint.pprint(master_list)
    result = rep_dc(master_list)
    print(result)
    result_string = ' '.join(result)
    print(result_string)

main()