包含列表

时间:2016-07-04 04:10:30

标签: python

我有两个清单:

lst1 = [{u'Hours': [{u'HourOfDay': 15, u'TotalVisits': 1, u'TotalTimeSpent': 7223.0},
                    {u'HourOfDay': 12, u'TotalVisits': 3, u'TotalTimeSpent': 37550.0}],
         u'DayOfWeek': 1},
        {u'Hours': [{u'HourOfDay': 19, u'TotalVisits': 6, u'TotalTimeSpent': 23497.0}],
         u'DayOfWeek': 2},
        {u'Hours': [{u'HourOfDay': 12, u'TotalVisits': 10, u'TotalTimeSpent': 36453.0}],
         u'DayOfWeek': 3},
        {u'Hours': [{u'HourOfDay': 13, u'TotalVisits': 22, u'TotalTimeSpent': 0.0},
                    {u'HourOfDay': 13, u'TotalVisits': 3, u'TotalTimeSpent': 4800.0}],
         u'DayOfWeek': 4},
        {u'Hours': [{u'HourOfDay': 9, u'TotalVisits': 5, u'TotalTimeSpent': 11879.0},
                    {u'HourOfDay': 8, u'TotalVisits': 1, u'TotalTimeSpent': 924.0},
                    {u'HourOfDay': 19, u'TotalVisits': 1, u'TotalTimeSpent': 8075.0}],
         u'DayOfWeek': 5},
        {u'Hours': [{u'HourOfDay': 19, u'TotalVisits': 1, u'TotalTimeSpent': 426.0},
                    {u'HourOfDay': 14, u'TotalVisits': 1, u'TotalTimeSpent': 1528.0}],
         u'DayOfWeek': 6},
        {u'Hours': [{u'HourOfDay': 17, u'TotalVisits': 8, u'TotalTimeSpent': 0.0}],
         u'DayOfWeek': 7}]  
lst2 = [{u'Hours': [{u'HourOfDay': 3, u'TotalVisits': 2, u'TotalTimeSpent': 127.0},
                    {u'HourOfDay': 12, u'TotalVisits': 2, u'TotalTimeSpent': 107.0}],
         u'DayOfWeek': 1},
        {u'Hours': [{u'HourOfDay': 8, u'TotalVisits': 1, u'TotalTimeSpent': 3.0},
                    {u'HourOfDay': 7, u'TotalVisits': 1, u'TotalTimeSpent': 14.0}],
         u'DayOfWeek': 2},
        {u'Hours': [{u'HourOfDay': 8, u'TotalVisits': 1, u'TotalTimeSpent': 85.0},
                    {u'HourOfDay': 0, u'TotalVisits': 10, u'TotalTimeSpent': 1634.0}],
         u'DayOfWeek': 3},
        {u'Hours': [{u'HourOfDay': 8, u'TotalVisits': 10, u'TotalTimeSpent': 719.0},
                    {u'HourOfDay': 17, u'TotalVisits': 1, u'TotalTimeSpent': 2.0}],
         u'DayOfWeek': 4},
        {u'Hours': [{u'HourOfDay': 23, u'TotalVisits': 2, u'TotalTimeSpent': 32.0},
                    {u'HourOfDay': 20, u'TotalVisits': 3, u'TotalTimeSpent': 322.0},
                    {u'HourOfDay': 21, u'TotalVisits': 1, u'TotalTimeSpent': 0.0}],
         u'DayOfWeek': 5},
        {u'Hours': [{u'HourOfDay': 8, u'TotalVisits': 1, u'TotalTimeSpent': 548.0},
                    {u'HourOfDay': 17, u'TotalVisits': 2, u'TotalTimeSpent': 40.0}],
         u'DayOfWeek': 6},
        {u'Hours': [{u'HourOfDay': 3, u'TotalVisits': 3, u'TotalTimeSpent': 5324.0},
                    {u'HourOfDay': 20, u'TotalVisits': 2, u'TotalTimeSpent': 45.0}],
         u'DayOfWeek': 7}]

它们由DayOfWeek分隔,而小时列表包含dicts,每个dicts在一天中的不同时段具有不同的数据。两个列表都用于单独的数据。我想在这两个列表中添加花费的总时间和访问次数,并从中创建一个新的类似列表。即如果同一DayOfWeek的HourOfDay相同,则添加TotalTimeSpent和总访问次数,否则将信息附加到Hours列表。我不想错过任何数据,只需附加两个,因为他们可能没有一天中的几个小时的数据,但我仍然希望它们在最后一个。

我想要的是每天两个列表的并集,如果同一DayOfWeek的两个集合的HourOfDay字段相同,则添加TotalVisits和TotalTimeSpent。

我试过了:

final = lst1[::]  
i = j = 0  
for item1, item2 in zip(lst1,lst2):  
    for hr1 in item1["Hours"]: 
        for hr2 in item2["Hours"]:  
            if hr1["HourOfDay"] == hr2["HourOfDay"]:  
                print "i: {0} ;; j: {1}".format(i,j)  
                final[i]["Hours"][j]["TotalTimeSpent"] = hr1["TotalTimeSpent"] + hr2["TotalTimeSpent"]  
        j += 1  
    i += 1  
    j = 0  

print final  

但它将它们加起来并在lst2中每个dict的Hours列表中遗漏了值,因为显而易见的原因,这些值在lst1中不存在。请帮忙!

2 个答案:

答案 0 :(得分:1)

好的,这是一个使用您当前数据结构的解决方案,我个人觉得这很愚蠢,因为它将列表中最糟糕的方面与字典中最糟糕的方面结合起来:

final = [] 
for d1,d2 in zip(list1,list2):
    new = {'DayOfWeek':d1['DayOfWeek'], 'Hours':[]}
    d1copy = d1['Hours'][:]
    d2copy = d2['Hours'][:]
    for hr1 in d1['Hours']:
        for hr2 in d2['Hours']:
            if hr1["HourOfDay"] == hr2["HourOfDay"]:
                ttspent = hr1["TotalTimeSpent"] + hr2["TotalTimeSpent"]
                tvisits = hr1['TotalVisits'] + hr2['TotalVisits']
                combo = {'HourOfDay':hr1['HourOfDay'], 
                         'TotalTimeSpent':ttspent,
                         'TotalVisits':tvisits}
                new['Hours'].append(combo)
                d1copy.remove(hr1)
                d2copy.remove(hr2)
    new['Hours'].extend(d1copy)
    new['Hours'].extend(d2copy)
    final.append(new)

结果:

[{'DayOfWeek': 1,
  'Hours': [{'HourOfDay': 12, 'TotalTimeSpent': 37657.0, 'TotalVisits': 5},
   {'HourOfDay': 15, 'TotalTimeSpent': 7223.0, 'TotalVisits': 1},
   {'HourOfDay': 3, 'TotalTimeSpent': 127.0, 'TotalVisits': 2}]},
 {'DayOfWeek': 2,
  'Hours': [{'HourOfDay': 19, 'TotalTimeSpent': 23497.0, 'TotalVisits': 6},
   {'HourOfDay': 8, 'TotalTimeSpent': 3.0, 'TotalVisits': 1},
   {'HourOfDay': 7, 'TotalTimeSpent': 14.0, 'TotalVisits': 1}]},
 {'DayOfWeek': 3,
  'Hours': [{'HourOfDay': 12, 'TotalTimeSpent': 36453.0, 'TotalVisits': 10},
   {'HourOfDay': 8, 'TotalTimeSpent': 85.0, 'TotalVisits': 1},
   {'HourOfDay': 0, 'TotalTimeSpent': 1634.0, 'TotalVisits': 10}]},
 {'DayOfWeek': 4,
  'Hours': [{'HourOfDay': 13, 'TotalTimeSpent': 0.0, 'TotalVisits': 22},
   {'HourOfDay': 13, 'TotalTimeSpent': 4800.0, 'TotalVisits': 3},
   {'HourOfDay': 8, 'TotalTimeSpent': 719.0, 'TotalVisits': 10},
   {'HourOfDay': 17, 'TotalTimeSpent': 2.0, 'TotalVisits': 1}]},
 {'DayOfWeek': 5,
  'Hours': [{'HourOfDay': 9, 'TotalTimeSpent': 11879.0, 'TotalVisits': 5},
   {'HourOfDay': 8, 'TotalTimeSpent': 924.0, 'TotalVisits': 1},
   {'HourOfDay': 19, 'TotalTimeSpent': 8075.0, 'TotalVisits': 1},
   {'HourOfDay': 23, 'TotalTimeSpent': 32.0, 'TotalVisits': 2},
   {'HourOfDay': 20, 'TotalTimeSpent': 322.0, 'TotalVisits': 3},
   {'HourOfDay': 21, 'TotalTimeSpent': 0.0, 'TotalVisits': 1}]},
 {'DayOfWeek': 6,
  'Hours': [{'HourOfDay': 19, 'TotalTimeSpent': 426.0, 'TotalVisits': 1},
   {'HourOfDay': 14, 'TotalTimeSpent': 1528.0, 'TotalVisits': 1},
   {'HourOfDay': 8, 'TotalTimeSpent': 548.0, 'TotalVisits': 1},
   {'HourOfDay': 17, 'TotalTimeSpent': 40.0, 'TotalVisits': 2}]},
 {'DayOfWeek': 7,
  'Hours': [{'HourOfDay': 17, 'TotalTimeSpent': 0.0, 'TotalVisits': 8},
   {'HourOfDay': 3, 'TotalTimeSpent': 5324.0, 'TotalVisits': 3},
   {'HourOfDay': 20, 'TotalTimeSpent': 45.0, 'TotalVisits': 2}]}]

答案 1 :(得分:0)

这是一个非常奇怪的字典结构,你甚至在一周中的几天都使用非零数字刻度。我花了一些时间来解析你的数据结构,但是这里发生了什么:&/ p>

lst1和lst2被构造为对象列表,如下所示:[{object Day 1},{object Day 2},... {object Day 7}]

这些列表中的每个对象都可以进一步分解为具有两个键的对象 - "小时"和" DayOfWeek":

object for Day x = {
    Hours: [list of other objects with keys for HourOfDay, TotalVisits, and TotalTimeSpent],
    DayOfWeek: x }

尽管如此,使用dicts列表并不具有内存效率,因此我建议使用多维列表进行快速检索和更新。

# Create a new list of lists that will be accessible by [day][hour]
#      This 7 x 24 array will contain dicts containing data for TotalVisits and TotalTimeSpent.  
#      This will permit O(1) retrieval for relevant entries by day & hour
#      I've included _Day and _Hour in the dict for the sake of readability 
#       (if you have more time, you can even make these immutable with a Base class)

newObject = [[{'_Day':i,'_Hour':j,'TotalVisits':0,'TotalTimeSpent':0}  \
                   for j in range(0,24)] for i in range(1,8)]

# Iterate over items in lst1, lst2 and add data to our new object
#    Don't forget to adjust the index for your days so that you don't get 
#       an index-out-of-bounds error.  
#   (Yet another reason why you should number your days 0-6 instead of 1-7.)

combinedList = lst1 + lst2
for item in combinedList:
    day = item['DayOfWeek']  # This will return an int 1-7; needs to be adjusted to zero-scale
    visitEntries = item['Hours'] # This will return a list of dicts
    for i in visitEntries:
          hour = i['HourOfDay']
          # Add visit data to our new object for each day, hour
          newObject[day-1][hour]['TotalVisits'] += i['TotalVisits']
          newObject[day-1][hour]['TotalTimeSpent'] += i['TotalTimeSpent']

# To see results:
for i in range(0,7):
    for j in range(0,24):
         print newObject[day][hour]