【问题标题】:splitting list, extracting an element and adding it in python拆分列表,提取元素并将其添加到python中
【发布时间】:2018-07-14 12:16:28
【问题描述】:

我是 python 新手。

我有一个带有“::”分隔符的列表,看起来是这样的;

1::艾琳·伯科维奇 (2000)::戏剧
2::刺客 (1995)::惊悚

我想用“::”分割它们,并从名称中提取年份并将其添加到行尾。每部电影都有自己的索引。

想要的列表看起来像;

1::艾琳·伯科维奇:戏剧::2000
2::刺客:惊悚:1995

我有以下代码:

for i in movies:
    movie_id,movie_title,movie_genre=i.split("::")
    movie_year=((movie_title.split(" "))[-1]).replace("(","").replace(")","")
    movies.insert(-1, movie_year)

但它根本不起作用。

有什么帮助吗?

提前致谢。

【问题讨论】:

  • it doesn't work at all 是什么意思?堆栈跟踪?
  • @MikeTung 这是无限循环。 OP 在迭代列表时正在扩展列表。

标签: python list join split add


【解决方案1】:

你有无限循环,因为当你添加一个项目时,你的循环需要迭代更多的项目,然后你正在添加另一个项目......

您应该使用结果创建一个新列表。

此外,您可以以更简单的方式提取列表:

movie_year = re.findall('\d+', '(2000)')

【讨论】:

    【解决方案2】:

    您可以使用re.findall 来获取所有字母数字字符(包括空格),而不是拆分,然后重新组合:

    import re
    s = ['1::Erin Burkovich (2000)::Drama', '2::Assassins (1995)::Thriller']
    new_data = [re.sub('\s(?=\:)', '', "{}::{}:{}:{}".format(id, name, type, year)) for id, name, year, type in [re.findall('[a-zA-Z0-9\s]+', i) for i in s]]
    

    输出:

    ['1::Erin Burkovich:Drama:2000', '2::Assassins:Thriller:1995']
    

    【讨论】:

      【解决方案3】:

      另一种(可能不太优雅)的方式:

      for i in movies:
          split_list = i.split("::")
          movie_id = split_list[0]
          movie_title = split_list[1].split('(')
          movie_genre = split_list[2]
          print movie_id + '::' + movie_title[0].strip() + "::" + movie_genre + "::" + movie_title[1].strip(')')
      

      【讨论】:

        【解决方案4】:

        对于 python 3.6,请查看此

        a="""1::Erin Burkovich (2000)::Drama
        2::Assassins (1995)::Thriller"""
        a=a.split("\n")
        c=[]
        for b in range(len(a)):
            g=[]
            d=a[b].split("::")
            e=d[1].split(" (")[1].split(")")[0]
            f=d[1].split(" (")[0]
            g.append(d[0])
            g.append(f)
            g.append(d[2])
            g.append(e)
            h="::".join(g)
            c.append(h)
        print("\n".join(c))
        

        输出::

        1::Erin Burkovich::Drama::2000
        2::Assassins::Thriller::1995
        

        【讨论】:

          【解决方案5】:

          很多问题,

          • split返回的不是元组而是列表,所以不能直接赋值
          • 电影年份分割很好,但您没有从原始标题中删除年份
          • 插入电影数组不是一个好主意,您需要替换数组元素

          我已经根据您的需要重写了代码,希望对您有所帮助

          movies=["1::Erin Burkovich (2000)::Drama", "2::Assassins (1995)::Thriller"]
          
          for i in range(len(movies)):
              movie_details=movies[i].split("::")
              print movie_details
              movie_id=movie_details[0]
              movie_title=movie_details[1]
              movie_genre=movie_details[2]
              movie_title_parts=movie_title.split(" ")
              movie_year=((movie_title_parts[-1]).replace("(","").replace(")",""))
              del movie_title_parts[-1]
              movie_title=" ".join(movie_title_parts)
              print movie_title+", "+movie_year
              movies[i]=movie_id+"::"+movie_title+"::"+movie_genre+"::"+movie_year
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-24
            • 1970-01-01
            • 2015-08-13
            • 1970-01-01
            • 1970-01-01
            • 2014-06-02
            相关资源
            最近更新 更多