我有以下文本文件(因为我们无法在此处附加文件,我已上传到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)
任何帮助将不胜感激!
答案 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表单是一种常见的用例,对于同一个密钥具有多个值并不常见但并非违法。