Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何以表格的形式打印这本词典?_Python_Python 3.x_Dictionary_Printing_Defaultdict - Fatal编程技术网

Python 如何以表格的形式打印这本词典?

Python 如何以表格的形式打印这本词典?,python,python-3.x,dictionary,printing,defaultdict,Python,Python 3.x,Dictionary,Printing,Defaultdict,我有一个这样的默认dict: {('Montag', '17.30'): [True, False], ('Dienstag', '16.30'): [True, False], ('Mittwoch', '15.30'): [True, False], ('Donnerstag', '14.30'): [True, False, False, True], ('Freitag', '13.30'): [True, False], ('Samstag', '12.30'): [True, Fal

我有一个这样的默认dict:

{('Montag', '17.30'): [True, False], ('Dienstag', '16.30'): [True, False], ('Mittwoch', '15.30'): [True, False], ('Donnerstag', '14.30'): [True, False, False, True], ('Freitag', '13.30'): [True, False], ('Samstag', '12.30'): [True, False], ('Sonntag', '11.30'): [True, False], ('Sonntag', '17.30'): [False, True], ('Samstag', '16.30'): [False, True], ('Freitag', '15.30'): [False, True], ('Mittwoch', '13.30'): [False, True], ('Dienstag', '12.30'): [False, True], ('Montag', '11.30'): [False, True], ('Donnerstag', '16.30'): [False, True], ('Samstag', '11.25'): [True,True]})
Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag  
0      0        0        0          0       100     0        11.25
50     0        0        0          0       0       50       11.30
0      50       0        0          0       50      0        12.30
0      0        50       0          50      0       0        13.30
0      0        0        50         0       0       0        14.30
0      0        50       0          50      0       0        15.30
0      50       0        50         0       50      0        16.30
50     0        0        0          0       0       50       17.30
我想把它打印成这样的表格:

{('Montag', '17.30'): [True, False], ('Dienstag', '16.30'): [True, False], ('Mittwoch', '15.30'): [True, False], ('Donnerstag', '14.30'): [True, False, False, True], ('Freitag', '13.30'): [True, False], ('Samstag', '12.30'): [True, False], ('Sonntag', '11.30'): [True, False], ('Sonntag', '17.30'): [False, True], ('Samstag', '16.30'): [False, True], ('Freitag', '15.30'): [False, True], ('Mittwoch', '13.30'): [False, True], ('Dienstag', '12.30'): [False, True], ('Montag', '11.30'): [False, True], ('Donnerstag', '16.30'): [False, True], ('Samstag', '11.25'): [True,True]})
Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag  
0      0        0        0          0       100     0        11.25
50     0        0        0          0       0       50       11.30
0      50       0        0          0       50      0        12.30
0      0        50       0          50      0       0        13.30
0      0        0        50         0       0       0        14.30
0      0        50       0          50      0       0        15.30
0      50       0        50         0       50      0        16.30
50     0        0        0          0       0       50       17.30
在x轴上,我想输出dict中相邻的所有日期。(每天仅一次)

在Y轴上,dict中发生的每次都应相互输出

该表应填写假与真的比率(可能是statistics.mean())

我只解决了用以下代码打印轴的问题:

WOCHENTAGE = {0: "Montag",
             1: "Dienstag",
              2: "Mittwoch",
              3: "Donnerstag",
              4: "Freitag",
              5: "Samstag",
              6: "Sonntag"}

set_for_day = set()
set_for_time = set()
for k, v in testdict.items():
    set_for_day.add(k[0])
    set_for_time.add(k[1])

order = list(WOCHENTAGE.values())    
for day in sorted(set_for_day, key = lambda x: order.index(x)):
    print(f"{day} ", end ="")
print()
for times in sorted(set_for_time):
    print(f"                                                            {times}")

这里的主要挑战是数据的格式。
(day,time)
元组作为dict的键,很难对dict进行索引,以获得每个day/time组合的所需值。如下面的代码所示,这可以通过将数据转换为dict来解决,dict可以作为
data[day][time]
索引,返回真实值的百分比。使用您在问题中已经提到的
defaultdict
,可以避免为缺少的值填充零

可以使用
sum
计算给定布尔值列表中的百分比:每个
True
都算作一,每个
False
都算作零。除以长度得到平均值,再乘以100得到百分比。我使用了
sum(bool(v)表示lst中的v)
以防传入一些非bool值(如整数)。如果需要,可以将其更改为just
sum(lst)

下面代码的输出与所需的输出匹配

from collections import defaultdict

# The example data.
data = {
    ('Montag', '17.30'): [True, False],
    ('Dienstag', '16.30'): [True, False],
    ('Mittwoch', '15.30'): [True, False],
    ('Donnerstag', '14.30'): [True, False, False, True],
    ('Freitag', '13.30'): [True, False],
    ('Samstag', '12.30'): [True, False],
    ('Sonntag', '11.30'): [True, False],
    ('Sonntag', '17.30'): [False, True],
    ('Samstag', '16.30'): [False, True],
    ('Freitag', '15.30'): [False, True],
    ('Mittwoch', '13.30'): [False, True],
    ('Dienstag', '12.30'): [False, True],
    ('Montag', '11.30'): [False, True],
    ('Donnerstag', '16.30'): [False, True],
    ('Samstag', '11.25'): [True,True]
}

# Week days, in order.
WEEK_DAYS = [
    "Montag",
    "Dienstag",
    "Mittwoch",
    "Donnerstag",
    "Freitag",
    "Samstag",
    "Sonntag"
]

# Given a list of values, return the percentage that are truthy.
def percentage_true(lst):
    return 100 * sum(bool(v) for v in lst) / len(lst)


# The list of days and times present in the data.
present_days = list(set(k[0] for k in data.keys()))
present_times = list(set(k[1] for k in data.keys()))

# Sort these days based on WEEK_DAYS.
present_days.sort(key = WEEK_DAYS.index)
# Sort the times by converting to minutes.
present_times.sort(key = lambda s: 60 * int(s[:2]) + int(s[3:]))

# Re-organize the data such that it can be indexed as
# data[day][time] => percentage. Use a defaultdict to
# return 0 for absent values.
data = {
    day: defaultdict(lambda: 0, {
        k[1]: percentage_true(v)
        for k, v in data.items() if k[0] == day
    })
    for day in set(k[0] for k in data.keys())
}

# Print the header.
for day in present_days:
    print(day, end=" ")
print()

# For printing, find the lengths of the day names, and the
# formats required for .format().
day_lengths = [len(s) for s in present_days]
perc_formats = ["{{:<{}.0f}}".format(l) for l in day_lengths]

# Print the values row-by-row.
for time in present_times:
    for day, fmt in zip(present_days, perc_formats):
        print(fmt.format(data[day][time]), end=" ")
    print(time)
从集合导入defaultdict
#示例数据。
数据={
('Montag','17.30'):[True,False],
('Dienstag','16.30'):[True,False],
('Mittwoch','15.30'):[True,False],
('Donnerstag','14.30'):[True,False,False,True],
('Freitag','13.30'):[True,False],
('Samstag','12.30'):[True,False],
('Sonntag','11.30'):[True,False],
('Sonntag','17.30'):[False,True],
('Samstag','16.30'):[False,True],
('Freitag','15.30'):[False,True],
('Mittwoch','13.30'):[False,True],
('Dienstag','12.30'):[False,True],
('Montag','11.30'):[False,True],
('Donnerstag','16.30'):[False,True],
('Samstag','11.25'):[True,True]
}
#一周几天,按顺序。
周日=[
“蒙塔格”,
“迪恩斯塔格”,
“米特沃奇”,
“唐纳斯塔格”,
“弗雷塔格”,
“桑斯塔格”,
“桑塔格”
]
#给定一个值列表,返回真实的百分比。
def百分比_真值(lst):
返回100*sum(第一次中的v为布尔(v)/len(第一次)
#数据中存在的日期和时间列表。
当前天数=列表(设置(k[0]表示数据中的k.keys())
当前时间=列表(设置(k[1]表示数据中的k.keys())
#根据周天数对这些天进行排序。
当前天数.sort(key=WEEK\u days.index)
#通过转换为分钟对时间进行排序。
当前时间.sort(key=lambda s:60*int(s[:2])+int(s[3:]))
#重新组织数据,使其可以按以下方式编制索引:
#数据[天][时间]=>百分比。使用defaultdict
#对于缺少的值,返回0。
数据={
日期:defaultdict(lambda:0{
k[1]:真实百分比(v)
对于k,如果k[0]==天,则data.items()中的v
})
对于集合中的日期(k[0]表示数据中的k.keys())
}
#打印标题。
对于当前的日期:
打印(日期,结束=“”)
打印()
#要打印,请查找日期名称的长度,以及
#.format()所需的格式。
日长度=[s的长度(以当前日为单位)]
perc_formats=[“{{:试试这个:

data = {('Montag', '17.30'): [True, False], ('Dienstag', '16.30'): [True, False], ('Mittwoch', '15.30'): [True, False], ('Donnerstag', '14.30'): [True, False, False, True], ('Freitag', '13.30'): [True, False], ('Samstag', '12.30'): [True, False], ('Sonntag', '11.30'): [True, False], ('Sonntag', '17.30'): [False, True], ('Samstag', '16.30'): [False, True], ('Freitag', '15.30'): [False, True], ('Mittwoch', '13.30'): [False, True], ('Dienstag', '12.30'): [False, True], ('Montag', '11.30'): [False, True], ('Donnerstag', '16.30'): [False, True], ('Samstag', '11.25'): [True,True]}


# get unique times
time = []
for item in data:
    time.append(item[1])

time_list = list(set(time))
sorted_time = sorted(time_list, key=float)

# set days
days = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag']

# create data sets
proper_data = []
for time in sorted_time:
    for day in days:
        for key, value in data.items():
            if key[1] == time and key[0] == day:
                if value.count(True) == 1:
                    proper_data.append('50')
                elif value.count(True) == 2:
                    proper_data.append('100')
        else:
            proper_data.append('0')
    proper_data.append(time)


# remove additional items
item_indexes = [n+1 for n,x in enumerate(proper_data) if x=='50' or x =='100']

for index in sorted(item_indexes, reverse=True):
    del proper_data[index]

# slice data into parts
final_data = []
for i in range(int(len(proper_data)/8)):
    final_data.append(proper_data[(8*i):(8*(i+1))])


# add time to names
days.append('Time')

# print data
final_data = [days] + final_data
for item in final_data:
    print("{:<10}{:<10}{:<10}{:<10}{:<10}{:<10}{:<10}{:<10}".format(item[0], item[1], item[2], item[3], item[4], item[5], item[6], item[7]))