【问题标题】:Merge lists while showing zeros in python在python中显示零时合并列表
【发布时间】:2018-07-22 11:38:27
【问题描述】:

我创建了一个 Django QuerySet 来计算值,但不幸的是它没有显示 0 值。因此,我想合并我的两个列表,例如 SQL 中的左连接。我展示了我的输入和期望的输出。

输入 1(Django 查询 1):

我这样打印出来:

for i in query_1:
     print (i['day'], i['count_1'])  

2018-01-17 00:00:00+01:00 49
2018-01-16 00:00:00+01:00 139
2018-01-15 00:00:00+01:00 144
2018-01-14 00:00:00+01:00 142
2018-01-13 00:00:00+01:00 141
2018-01-12 00:00:00+01:00 144
2018-01-11 00:00:00+01:00 145
2018-01-10 00:00:00+01:00 95

输入 2(Django 查询 2):

我这样打印出来:

    for i in query_2:
         print (i['day'], i['count_2'])  

   2018-01-17 00:00:00+01:00 2
   2018-01-16 00:00:00+01:00 6
   2018-01-14 00:00:00+01:00 2
   2018-01-13 00:00:00+01:00 4

我想要的输出是:

2018-01-17 00:00:00+01:00 49  2
2018-01-16 00:00:00+01:00 139 6
2018-01-15 00:00:00+01:00 144 0
2018-01-14 00:00:00+01:00 142 2
2018-01-13 00:00:00+01:00 141 4
2018-01-12 00:00:00+01:00 144 0
2018-01-11 00:00:00+01:00 145 0
2018-01-10 00:00:00+01:00 95  0 

我试过了,但失败了:

for a, b in zip (query_1, query_2)
    if a['day'] == b['day']:
       print (a['count_2']) #It prints only the result of query_2 not both :(
    else:
       print ('0') 

【问题讨论】:

  • 失败在哪方面?发生了什么?
  • 对不起,我编辑了我的错字。它只打印 4 个值 (2,6,2,4),不打印零。
  • "我创建了一个 Django QuerySet 来计算值,但不幸的是它没有显示 0 值。因此我想合并我的两个列表,比如 SQL 中的左连接" => 也许你应该解决这个问题通过发出您想要的确切查询来代替来源? docs.djangoproject.com/en/2.0/topics/db/sql
  • 重复压缩两个列表,直到用完较短的列表。
  • @brunodesthuilliers 我知道原始 sql 方法,但我只想使用内置的可能性。

标签: python list count left-join django-queryset


【解决方案1】:
query_1 = [{'day': '2018-01-17 00:00:00+01:00','count_1': '49'},
           {'day': '2018-01-16 00:00:00+01:00','count_1': '139'},
           {'day': '2018-01-15 00:00:00+01:00','count_1': '144'},
           {'day': '2018-01-14 00:00:00+01:00','count_1': '142'}]


query_2 = [{'day': '2018-01-17 00:00:00+01:00','count_2': '2'},
           {'day': '2018-01-16 00:00:00+01:00','count_2': '6'},
           {'day': '2018-01-15 00:00:00+03:00','count_2': '2'},
           {'day': '2018-01-14 00:00:00+01:00','count_2': '4'}]

for a, b in zip(query_1, query_2):
    if a['day'] == b['day']:
        print a['day'] + " " + a['count_1'] + " " + b['count_2']
    else:
        print a['day'] + " " + a['count_1'] + " 0"

输出:

2018-01-17 00:00:00+01:00 49 2
2018-01-16 00:00:00+01:00 139 6
2018-01-15 00:00:00+01:00 144 0
2018-01-14 00:00:00+01:00 142 4

【讨论】:

  • 不幸的是,这种方法就像我的尝试一样有效。它只打印 4 行。如果您尝试我的 query_1 输出的整个部分(包含 8 行),则代码仅打印 4 行而不是 8 行。
【解决方案2】:
new_data = [ i['day'] + ' ' + str(i['count_1']) for i in query_1]  
new_data.extend([ i['day'] + ' ' + str(i['count_1']) for i in query_2])
local_dict = {}
for values in new_data:
    date, time, val = values.split()
    if date in local_dict:
        new_value = local_dict[date]
        local_dict[date] = new_value.replace(new_value[-1],val)
    else:
        local_dict.setdefault(date,values+ (' %s' % '0'))
print(local_dict.values())
>>>
["2018-01-17 00:00:00+01:00 49  2",
"2018-01-16 00:00:00+01:00 139 6",
"2018-01-15 00:00:00+01:00 144 0",
"2018-01-14 00:00:00+01:00 142 2",
"2018-01-13 00:00:00+01:00 141 4",
"2018-01-12 00:00:00+01:00 144 0",
"2018-01-11 00:00:00+01:00 145 0",
"2018-01-10 00:00:00+01:00 95  0"]

【讨论】:

    【解决方案3】:

    我尝试使用 pandas,我认为这是最简单的方法。我的方法的步骤是:

    1、将对象转换为DataFrame

    • pd_query_1 = pd.DataFrame.from_records(query_1)

    • pd_query_2 = pd.DataFrame.from_records(query_2)

    2、左连接两个查询

    • result = (pd.merge(pd_query_1, pd_query_2, how='left', on=['day', 'day'])).fillna(0)

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 2015-03-19
      • 2013-11-17
      • 2018-08-22
      • 1970-01-01
      • 2017-09-05
      • 2011-07-31
      • 2021-11-23
      相关资源
      最近更新 更多