Python 从字典中删除特定文本和字符
有这样一个名为“数据列表”的列表(唯一更大的方法):Python 从字典中删除特定文本和字符,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,有这样一个名为“数据列表”的列表(唯一更大的方法): 2017-04-01, available 2017-04-02, available 2017-04-01, available 2017-04-02, available 2017-04-02, available 2017-04-01, available 2017-04-02, available 2017-04-01, available 2017-04-02, available 2017-04-01, available etc
2017-04-01, available
2017-04-02, available
2017-04-01, available
2017-04-02, available
2017-04-02, available
2017-04-01, available
2017-04-02, available
2017-04-01, available
2017-04-02, available
2017-04-01, available
etcetera
我使用了以下代码
dates = collections.defaultdict(list)
for date, xyz in data_list:
dates[date].append(xyz)
counts = {date: collections.Counter(xyz) for date, xyz in dates.items()}
要创建这样的词典,请执行以下操作:
2017-04-01,Counter({'available': 9})
2017-04-02,Counter({'available': 12})
2017-04-03,Counter({'available': 9})
2017-04-04,Counter({'available': 4})
2017-04-05,Counter({'available': 9})
2017-04-06,Counter({'available': 2})
date, available
2017-04-01, 9
2017-04-02, 12
2017-04-03, 9
2017-04-04, 4
2017-04-05, 9
2017-04-06, 2
我如何删除“计数器”?(最后是像“(”和“{”)这样的字符)
目前,我有这个代码。但它没有任何作用
for x in my_dictionary:
try:
x = x.replace('Counter','')
except:
pass
最终的主要目标是获得如下.csv文件:
2017-04-01,Counter({'available': 9})
2017-04-02,Counter({'available': 12})
2017-04-03,Counter({'available': 9})
2017-04-04,Counter({'available': 4})
2017-04-05,Counter({'available': 9})
2017-04-06,Counter({'available': 2})
date, available
2017-04-01, 9
2017-04-02, 12
2017-04-03, 9
2017-04-04, 4
2017-04-05, 9
2017-04-06, 2
字典打印输出的一部分:
'2018-12-12': Counter({'available': 3}), '2018-04-28': Counter({'available': 4}), '2017-12-16': Counter({'available': 2}), '2017-12-17': Counter({'available': 2}), '2017-12-14': Counter({'available': 2}), '2017-12-15': Counter({'available': 2}), '2017-12-12': Counter({'available': 2}), '2017-12-13': Counter({'available': 2}), '2017-12-10': Counter({'available': 2}), '2017-12-11': Counter({'available': 2}), '2017-12-18': Counter({'available': 2}), '2017-12-19': Counter({'available': 2}), '2018-05-31': Counter({'available': 4}), '2018-05-30': Counter({'available': 4}),
您就快到了。您可以通过使用
available
键从计数器获取可用计数,如下所示:
counts = {date: collections.Counter(xyz)['available'] for date, xyz in dates.items()}
import csv
def to_row(date, counter):
return date, counter['booked'], counter['blocked'], counter['available']
counts = [to_row(date, collections.Counter(xyz)) for date, xyz in dates.items()]
writer = csv.writer(open('<filename>.csv', 'w'))
writer.writerows(counts)
counts={date:collections.Counter(xyz)['available']表示日期,xyz表示日期。items()}
导入csv
def to_行(日期、计数器):
返回日期,计数器['booked'],计数器['blocked'],计数器['available']
counts=[to_row(date,collections.Counter(xyz))表示日期,xyz表示日期。items()]
writer=csv.writer(打开('.csv',w'))
writer.writerows(计数)
您根本不需要集合。在这种情况下,计数器
,甚至可以取消集合。defaultdict
。这将实现以下功能:
dates = {}
for date, value in data_list:
if value == "available":
dates[date] = dates.get(date, 0) + 1
# dates contains (date, count) pairs
而且速度也应该快得多。然后,您可以使用csv.writer
或csv.DictWriter
(取决于所需的输出csv)写出最终的csv。例如:
import csv
data_list = [['2017-04-01', 'available'],
['2017-04-02', 'available'],
['2017-04-01', 'available'],
['2017-04-02', 'available'],
['2017-04-02', 'available'],
['2017-04-01', 'available'],
['2017-04-02', 'available'],
['2017-04-01', 'available'],
['2017-04-02', 'available'],
['2017-04-01', 'available']]
dates = {}
for date, value in data_list:
if value == "available":
dates[date] = dates.get(date, 0) + 1
with open("output.csv", "wb") as f: # open output.csv for writing
writer = csv.writer(f) # create a csv.writer
writer.writerow(("date", "available")) # write our header
for row in dates.iteritems(): # sorted(dates.iteritems()) instead for date-sorted output
writer.writerow(row) # write the row
获取有效的CSV,如下所示:
date,available
2017-04-02,5
2017-04-01,5
你几乎可以在任何电子表格应用程序中打开它。如果你想将其格式化为输出格式,请注意这不是有效的CSV
更新-每个日期都有多个可用值的版本(此时使用集合。计数器
更方便,但要与主题保持一致):
你可以有任意多个“值”字段,这样就不必只有3个。你想要的输出不是一个列表。而且那些
计数器是集合。计数器对象(不是字符串),如果你想的话,你可以简单地访问键和值。它曾经是一个字典,我用它转换成了一个列表“对于计数中的x。项():ListCalendar.append(x)”。其中“计数”"是原始字典。所以你说最好保留字典并删除其中的字符?是的,如果你可以从字典中获取项目,这将是一个更好的方法。而且,即使项目仍然是复杂的对象,你也可以解析它们,或者在嵌套循环中获取预期的项目,或者在列表理解中获取整个操作。但是,你该怎么做呢我解决了这样一个问题?使用字典对我来说是非常新的。最终我需要以如上所示的方式输出一个.csv。如果您也输入用于创建字典的代码,或者至少指定字典确切包含的内容,可能会更容易理解:您编写的内容看起来像一个包含也是一本字典。最好的方法可能是复制/粘贴打印my_dictionary的输出。如果有3种可能的状态,例如booked(预订)和blocked(阻止),这也会起作用吗?因此,在每个日期后,可以有3个数字:预订量、blocked(阻止)和available(可用)。是的,如果您只对available(可用)
状态感兴趣。如果您需要所有三种状态集合。计数器可能会更方便(并且更易于维护),但您可以使用日期获得相同的效果。setdefault(date,{})[value]=dates.get(date,{})。get(value,0)+1
而不是检查值==“是否可用”
并且只计算可用的条目-这将为您提供一个包含所有计数的dict作为输出。然后,您需要在写入csv时使用csv.DictWriter
(或手动计算位置)。您需要将日期放在何处。setdefault(date,{})[value]=dates.get(date,{})。get(value,0)在你的代码中+1使其工作?我对python相当陌生。对不起。所以我得到了三种状态的计数,不仅是“可用”这确实很有用。我如何调整这段代码,以便我可以获得三种状态?如预订、阻止和可用。你想如何返回它?作为日期和状态元组的字典?如果你想要它作为CSV,作为列表列表返回似乎是一种方式。[[date,booked,blocked,available],…]
。然后您可以使用CSVWriter中的writerows
来编写列表。我将[[date,booked,blocked,available],…]放在哪里?对不起,我对Python相当陌生,但我觉得我离正确答案很近了。返回输出的格式应该是最适合将其转换为的格式。csvIt在*处的“*”处给出了“无效语法”错误