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在*处的“*”处给出了“无效语法”错误