函数不在字典中附加值

时间:2018-04-10 23:15:41

标签: python python-3.x dictionary

我有以下文本文件(因为我们无法在此处附加文件,我已上传到Pastebin)

https://pastebin.com/zicShFFm

我正在使用下面提供的功能读取此文本文件,报废数据(使用正则表达式),该功能完美运行。 唯一的问题是如果电影在文件中出现两次,它不会附加值。它取代了它。

例如:

安静的地方(2018年)正在" Studio Movie Grill - Downey"和#34; AMC Norwalk 20&#34 ;;处理文本文件时,它将插入第一个电影院的电影细节,但当它读取第二个电影院的相同电影细节时,它将删除旧条目并更新新条目。

这是功能:

movie_details=[]
movie_name=[]
final_dict={}

def textScrapper(theater,filepath):
    pattern=r'\w.+(?=\([0-9]{4})'
    with open(filepath,'r') as f:
    def regex_approach():
        sub_details=[]
        for line in f:
        logging.info(line)
        if re.search(pattern,line):
            movie_name.append(re.search(pattern,line).group())
            if sub_details:
                 logging.info(sub_details)
                 movie_details.append(sub_details)
            sub_details=[]
        else:
            sub_details.append(line.strip())       
        movie_details.append(sub_details)
    regex_approach()
    final_dict=dict(zip(movie_name,unique))
    return final_dict

theater='abc'
results=textScrapper('abc',filepath)
print(results)

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

dict只能为每个键设置一个值。每次尝试为现有密钥分配新值时,它只会替换旧值。即使你在构造函数中执行它。例如:

>>> keys = [1, 2, 3, 1]
>>> values = ['a', 'b', 'c', 'd']
>>> dict(zip(keys, values))
{1: 'd', 2: 'b', 3: 'c'}

(1, 'd')取代(1, 'a')。如果在执行此操作时有两部同名电影,则代码中会发生完全相同的事情:

final_dict=dict(zip(movie_name,unique))

将单个键映射到一个或多个值而不是仅仅一个值的东西通常称为“多指令”。在Python中,这通常被实现为一个普通的旧dict,其值是实际值的集合或列表。 1

在您的情况下,实际值是列表,这些列表是可变的,因此无法放入集合中。如果你实际上并不需要它们是可变的,那么你最好不要使用元组,但我们假设你确实需要特定的列表。

你可以这样写:

final_dict = {}
for name, detail in zip(movie_name, unique):
    final_dict.setdefault(name, list()).append(detail)

或者,或者:

final_dict = collections.defaultdict(list)
for name, detail in zip(movie_name, unique):
    final_dict[name].append(unique)

两者之间的区别在于,如果您稍后尝试查找不存在的名称会发生​​什么 - 使用setdefault构建的普通字典会引发KeyError,而set 3}}会给你一个空的defaultdict。因此,无论您想要哪两种结果,请选择相应的实施方案。 (偶尔,你真的不在乎任何一种方式。在这种情况下,final_dict['A Quiet Place (2018)']通常会更快,同样容易理解。)

现在,Counter将是所有正在播放的剧院的集合,您可以轻松地循环播放,或者您想要做的其他任何事情。

<子> 1。一个真正的multidict类型应该有一些方法可以使用重复键来迭代键值对,而不是使用键值集对,类似于d[key]可以用于多集合的方式。 PyPI上有各种提供此功能的库,但所有API都略有不同,有些库还会使key返回第一个值,并需要一个特殊方法来获取[CI_ROOT]/application/libraries/ 的所有值。其中许多都嵌入在各种客户端或服务器端Web框架中,因为Web表单是一种常见的用例,对于同一个密钥具有多个值并不常见但并非违法。