【问题标题】:Comparing list with a list of lists将列表与列表列表进行比较
【发布时间】:2020-02-25 01:38:31
【问题描述】:

我有一个列表 string_array = ['1', '2', '3', '4', '5', '6'] 和一个列表列表 multi_list = [['1', '2'], ['2', '3'], ['2', '4'], ['4', '5'], ['5', '6']]

multi_list 中每个子列表的第一个元素将在 string_array 中具有关联条目。

(子列表不会有重复的元素)

如何将这些关联元素映射到字典中,例如:

{
'1': ['2'],
'2': ['3', '4'],
'3': [],
'4': ['5'],
'5': ['6'],
'6': []
}

【问题讨论】:

  • 首先为第一个列表中的每个元素创建一个包含空列表的字典。然后遍历第二个列表,将第二个项目附加到字典的适当元素。
  • 第二个列表中是否有一个值没有与第一个列表匹配的起始值?
  • 有什么问题?你有没有尝试过什么,做过什么研究?
  • @user12091650 你在哪个部分苦苦挣扎?
  • @AMC 实际上,我对您对这篇文章的贡献感到困惑。 Barmar 提出了一些在答案中实施的建议,Flakes 很好地暗示了我的方法应该如何,Juanpa 为我接受的答案提出了改进的解决方案。我不明白你想要做什么。你不喜欢这个问题,投反对票并继续。别再浪费我的时间了。

标签: python list dictionary


【解决方案1】:

这里有一些概念会对您有所帮助,但我不会为您提供完整的解决方案。您应该自己这样做以沉浸在概念中。

制作一个空的列表字典

{
    '1': [],
    '2': [],
    '3': [],
    '4': [],
    '5': [],
    '6': [],
}

你可以使用 for 循环:

list_one = ['1', '2', '3', '4', '5', '6']

my_dict = {}
for value in list_one:
    my_dict[value] = []

你也可以使用字典理解:

my_dict = {value: [] for value in list_one}

现在您需要遍历第二个列表和append 到当前列表。例如要附加到列表,您可以通过以下几种方式进行:

a = [1,2]
b = [3,4]
c = 5

# add a list to a list
a += b
# now a = [1,2,3,4]

# add a list to a list
b.append(c)
# now b = [3,4,5]

要分割列表,您可以使用切片表示法:

a = [1,2,3,4]
b = a[:2]
c = a[2:]
# now b = [1,2], and c = [3,4]

要访问字典中的项目,您可以这样做:

a = { '1': [1,2,3] }
a['1'] += [4,5,6]
# now a = { '1': [1,2,3,4,5,6] }

【讨论】:

  • +1 为 OP 提供机会自行解决问题总是一件好事,尤其是在他/她没有提供任何尝试的情况下。
【解决方案2】:
flat = ['1', '2', '3', '4', '5', '6']
nested = [['1', '2'], ['2', '3'], ['2', '4'], ['4', '5'], ['5', '6']]

result = {key: [] for key in flat}

for key in result:
    result[key] = [nest[1] for nest in nested if key == nest[0]]


#{'1': ['2'], '2': ['3', '4'], '3': [], '4': ['5'], '5': ['6'], '6': []}

使用平面列表元素作为键,您可以生成字典并使用空列表作为值。如果稍后使用列表推导生成值,空字符串或 None 也可以工作。

然后只需遍历字典中的键和嵌套列表以将结果附加到适当的键。

此外;

您可以将上述内容简化为输出相同结果的单行。

result = {key: [nest[1] for nest in nested if key == nest[0]] for key in flat}

输出:

{'1': ['2'], '2': ['3', '4'], '3': [], '4': ['5'], '5': ['6'], '6': []}

编辑:

在评估了 Juanpa 的评论并测试了上述代码的效率后,很明显在遇到大型数据集时有更好的方法来运行它。

评论参考:

这个解决方案是 O(N*M),其中 N 和 M 是平面和嵌套的大小。您可以在 O(MAX(N, M)) 中执行此操作。基本上,循环嵌套而不是结果,并在嵌套中执行 for a,b:result[a].append(b)

运行上述代码 1000 次,平面列表中有 1000 个元素,嵌套列表中有 1000 个嵌套列表。运行时间为;

print(t.timeit(1000))
39.37227249999978

但是,使用以下代码运行它拥有更高效的运行时间。

print(j.timeit(1000))
0.17638869999973394

代码:

result = {key: [] for key in flat}
for a, b in nested:
    if a in result:
        result[a].append(b)

【讨论】:

  • 您如何建议使用更大的数据集@juanpa.arrivillaga 来解决这个问题?
  • 这个解决方案是 O(N*M) 其中 N 和 M 是平面和嵌套的大小。您可以在 O(MAX(N, M)) 中执行此操作。基本上,循环嵌套而不是结果,然后执行for a,b in nested: result[a].append(b)
  • @juanpa.arrivillaga 在运行更大的数据集后,效率差异很明显。我在答案中添加了更有效的方法和运行时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多