Python:比较两个要进行格式匹配的列表,并将其制成字典

时间:2019-05-21 22:36:17

标签: python list dictionary

我正在使用python 3:我有两个列表,我想使用相似的信息将它们合并到字典中:

first_list = [('1234', 'abcd', 'John Doe', 'good_status'), 
              ('1234', 'efgh', 'John Doe', 'good_status'), 
              ('1234', 'hijk', 'John Doe', 'bad_status'), 
              ('5566', 'abjk', 'George Washington', 'good_status'), 
              ('7889', 'zyxw', 'Jane Austin', bad_status')]

第二个列表可能是:

second_list = [('1234', 'John Doe', 'abcd efgh hijk'), 
               ('5566', 'George Washington', 'abjk'), 
               ('7889', 'Jane Austin', 'zyxw')]

所需字典输出:

dictionary = {'1234' : ('John Doe', 'abcd_good efgh_good hijk_baad')
              '5566': ('George Washington', 'abjk_good')
              '7889': ('Jane Austin', 'zyxw_bad')
              }

first_list中,条目[0][2][0]的条目[1]和条目second_list相匹配。

first_list包含条目[1][3],它们应合并在一起并与second_list[2]

匹配

哦...而且两个列表的排列并不完全一样,索引的0可能与0的索引second_list的名字不同。

我是新手,有点烦,可以使用任何建议。

3 个答案:

答案 0 :(得分:1)

我用两个功能make_dict_from_listmatch_two_dicts提出了一个解决方案。有多种方法可以使列表理解更简洁,但是我写了很长的一段话,以便更清楚地了解它们在做什么。

def make_dict_from_list(list):
    temp_dict={}
    for record in list:
        for word in record:
            if word == record[0]:
                temp_dict[record[0]] = []
            else:
                temp_dict[record[0]].append(word)
    return temp_dict

此方法创建一个临时字典,并逐个记录地遍历列表。它将单词的第一个位置(if word = record[0])作为字典的键,并设置一个空数组作为该键的值。如果不是第一个单词(即else),则append会将该行中的所有其他单词替换为该数组。接下来,您可以调用这些方法来制作字典。预期结果:

>>>>make_dict_from_list(first_list)
{'1234': ['hijk', 'John Doe', 'bad_status'], '5566': ['abjk', 'George Washington', 'good_status'], '7889': ['zyxw', 'Jane Austin', 'bad_status']}

>>>>make_dict_from_list(second_list)
{'1234': ['John Doe', 'abcd efgh hijk'], '5566': ['George Washington', 'abjk'], '7889': ['Jane Austin', 'zyxw']}

现在我们可以进行第二种方法了:

def match_two_dicts(dict1, dict2):
    for index1, key1 in enumerate(dict1):
        for index2, key2 in enumerate(dict2):
            if key1 == key2:
                print(f"ID {key1}: match at dict1[{index1}], dict2[{index2}]")

这会将dict1dict2中的条目拆分为键值对列表。我们使用enumerate,因此我们在每个字典中都有一个位置索引。然后,如果ID(即每个记录的键)匹配,我们就可以打印出匹配的位置。

预期结果:

>>> match_two_dicts(dict1, dict2)
ID 1234: match at dict1[0], dict2[0]
ID 5566: match at dict1[1], dict2[1]
ID 7889: match at dict1[2], dict2[2]

edit:我刚刚注意到您的第一个列表中有重复的ID,但我的解决方案并未对此进行说明。如果这对于您的应用程序是必需的,则您将需要修改代码以使用具有一个键的字典列表,而不是具有多个键的单个字典。如果您有问题,请告诉我。

答案 1 :(得分:0)

您需要一个double for循环来检查每个项目的状态,然后根据匹配项将其组合成字典。

In [33]: np.matrix(x)                                                                                    
Out[33]: matrix([[0, 0, 0, 0]])
In [34]: np.dot(A, np.matrix(x).T)                                                                       
Out[34]: 
matrix([[0],
        [0],
        [0],
        [0]])

答案 2 :(得分:0)

我的解决方案是仅使用bool StringSet(RedisKey key, RedisValue value, TimeSpan? expiry = null, When when = When.Always, CommandFlags flags = CommandFlags.None); 而不引用_redis.StringSet("Key", JsonConvert.SerializeObject(object), new TimeSpan(1, 0, 0));

由于我使用了first_list,因此以下代码可以在second_list的环境下运行。

下面列出的完整代码:

>=python 3.6