for循环中的Python字典和列表

时间:2018-10-12 00:53:26

标签: python python-3.x dictionary

我的代码就是这样

for dict_item in data:
    MILLISECONDS = dict_item['Start_Time'].split('(')[1][:-2]
    mydict = {'Cinema_Name':dict_item['Cinema_Name'],
              'Movie_Time':datetime.datetime.fromtimestamp(int(MILLISECONDS)/1000.0).strftime('%B-%d-%Y %I:%M %p'),
ListOfJson.append(mydict)

输出是这个

 {
    "Cinema_Name": "Cinema 3",
    "Movie_Time": "October-13-2018 06:20 PM"
},
{
    "Cinema_Name": "Cinema 3",
    "Movie_Time": "October-13-2018 09:15 PM"
},
{
    "Cinema_Name": "Cinema 6",
    "Movie_Time": "October-12-2018 11:30 AM"
},
{
    "Cinema_Name": "Cinema 6",
    "Movie_Time": "October-12-2018 02:25 PM"
}

但是我想要一个输出,它将与来的Cinema_Name合并,并将它们的时间放在列表中。像这样的东西

{
    "Cinema_Name": "Cinema 3"
    "Movie_Time": " ["October-13-2018 06:20 PM","October-13-2018 09:15 PM"]
},
{
    "Cinema_Name": "Cinema 6"
    "Movie_Time: ["October-12-2018 11:30 AM" ,"October-12-2018 02:25 PM"]

反正我能做到吗?

3 个答案:

答案 0 :(得分:1)

您可以使用字典来跟踪新Movie_Time的第一个条目的Cinema_Name列表,以便同一Cinema_Name的后续条目可以附加到相同的列表:

ListOfJson = [
    {
        "Cinema_Name": "Cinema 3",
        "Movie_Time": "October-13-2018 06:20 PM"
    },
    {
        "Cinema_Name": "Cinema 3",
        "Movie_Time": "October-13-2018 09:15 PM"
    },
    {
        "Cinema_Name": "Cinema 6",
        "Movie_Time": "October-12-2018 11:30 AM"
    },
    {
        "Cinema_Name": "Cinema 6",
        "Movie_Time": "October-12-2018 02:25 PM"
    }
]
l = []
index = {}
for d in ListOfJson:
    if d['Cinema_Name'] in index:
        index[d['Cinema_Name']].append(d['Movie_Time'])
    else:
        index[d['Cinema_Name']] = d['Movie_Time'] = [d['Movie_Time']]
        l.append(d)
print(l)

使用示例输入,l将变为:

[{'Cinema_Name': 'Cinema 3', 'Movie_Time': ['October-13-2018 06:20 PM', 'October-13-2018 09:15 PM']}, {'Cinema_Name': 'Cinema 6', 'Movie_Time': ['October-12-2018 11:30 AM', 'October-12-2018 02:25 PM']}]

答案 1 :(得分:0)

创建一个新的dict并创建您的列表。不需要奇特的代码或List解析。只需两行代码:[obj["Movie_Time"] for obj in myDict if obj["Cinema_Name"] == "Cinema 3"],另一行则用于Cinema 6,如下所示。

myDict = [
    {
        "Cinema_Name": "Cinema 3",
        "Movie_Time": "October-13-2018 06:20 PM"
    },
    {
        "Cinema_Name": "Cinema 3",
        "Movie_Time": "October-13-2018 09:15 PM"
    },
    {
        "Cinema_Name": "Cinema 6",
        "Movie_Time": "October-12-2018 11:30 AM"
    },
    {
        "Cinema_Name": "Cinema 6",
        "Movie_Time": "October-12-2018 02:25 PM"
    }
]

ListOfJson = [
    {
        "Cinema_Name": "Cinema 3",
        "Movie_Time": [obj["Movie_Time"] for obj in myDict if obj["Cinema_Name"] == "Cinema 3"]
    },
    {
        "Cinema_Name": "Cinema 6",
        "Movie_Time": [obj["Movie_Time"] for obj in myDict if obj["Cinema_Name"] == "Cinema 6"]
    }
]

print(ListOfJson)

输出:

[
  {
    'Cinema_Name': 'Cinema 3',
    'Movie_Time': [
      'October-13-2018 06:20 PM',
      'October-13-2018 09:15 PM'
    ]
  },
  {
    'Cinema_Name': 'Cinema 6',
    'Movie_Time': [
      'October-12-2018 11:30 AM',
      'October-12-2018 02:25 PM'
    ]
  }
]

我的解决方案与@blhsing解决方案之间的区别是: 矿山只能同时启动3个进程,从而加快了速度。 enter image description here

@blhsing的解决方案对2个孩子有5个进程,这大大降低了您的速度。 enter image description here

答案 2 :(得分:0)

您可以在迭代列表时使用时间字典来索引电影院,并可以附加电影时间:

temp_dict = {}
for dict_item in data:
    movie_time = datetime.datetime.fromtimestamp(int(MILLISECONDS)/1000.0).strftime('%B-%d-%Y %I:%M %p')
    if dict_item['Cinema_Name'] not in temp_dict:
        temp_dict[dict_item['Cinema_Name']] = {
            'Cinema_Name':dict_item['Cinema_Name'],
            'Movie_Time': []
        }
    temp_dict[dict_item['Cinema_Name']]['Movie_Time'].append(movie_time)

ListOfJson = list(temp_dict.values())