Python 两个 For 循环中的两个列表

Posted

技术标签:

【中文标题】Python 两个 For 循环中的两个列表【英文标题】:Python two Lists In two For Loops 【发布时间】:2018-10-28 03:56:06 【问题描述】:

我这里有两个列表:

list1 = [u'2018-05-06T15:53:05.000-0400', '2018-05-06T17:53:05.000-0400']

list2 = [u'2018-05-06T15:32:24.000-0400', u'2018-05-06T15:32:29.000-0400', u'2018-05-06T15:32:36.000-0400', u'2018-05-06T15:53:05.000-0400', u'2018-05-06T16:42:41.000-0400', u'2018-05-10T00:16:12.000-0400', u'2018-05-10T00:16:23.000-0400', u'2018-05-12T17:37:42.000-0400']

我正在尝试比较两个列表中的元素,并返回 list1 中的元素 0 和 list2 中的元素 1 不同的最小值,例如:

for value1 in list1:
    value1 = datetime.strptime(value1, '%Y-%m-%dT%H:%M:%S.000-0400')
    for value2 in list2:
        value2 = datetime.strptime(value2, '%Y-%m-%dT%H:%M:%S.000-0400')
        if value1 < value2:

            value3 = value2 - value1
            list3.append(value3)
 print list3

打印清单3 给我:

[datetime.timedelta(0, 2976), datetime.timedelta(3, 30187), datetime.timedelta(3, 30198), datetime.timedelta(6, 6277), datetime.timedelta(3, 22987), datetime .timedelta(3, 22998), datetime.timedelta(5, 85477)]

所有内容都在同一个列表中。 在list3[0] 中,我可以获得list1 中第一个元素的最小值,但是如果我在list1 中有元素3,我如何获得第二个元素list3[3] 的最小值并循环?

我想将list1 中第一个元素和第二个元素的比较结果列表分开,请告诉我如何实现这一点,非常感谢!

【问题讨论】:

您能否更好地澄清您的问题?鉴于您不能减去两个字符串,您的代码现在甚至无法工作。为 ex 提供预期输出 嗨 RafaelC,感谢您回复我,我进行了 striptime 转换,将 unicode 转换为 datatime 格式并进行比较,我已经更新了代码。 【参考方案1】:

如果我理解正确,您可以将时间增量分隔在不同的列表中,然后只需使用 min 即可获得最小值。

使用您自己的代码:

list3=[]
for value1 in list1:
    value1 = datetime.strptime(value1, '%Y-%m-%dT%H:%M:%S.000-0400')
    aux_list = []
    for value2 in list2:
        value2 = datetime.strptime(value2, '%Y-%m-%dT%H:%M:%S.000-0400')
        if value1 < value2:

            value3 = value2 - value1
            aux_list.append(value3)
    list3.append(aux_list)

这样,您的list3 就保存了list1 的每个元素与list2 的所有元素之间的差异

>>> print(list3)
[[datetime.timedelta(0, 2976), datetime.timedelta(3, 30187), datetime.timedelta(3, 30198), datetime.timedelta(6, 6277)], 
 [datetime.timedelta(3, 22987), datetime.timedelta(3, 22998), datetime.timedelta(5, 85477)]]

然后您可以使用min(list[0]) 和第二个min(list[1]) 获得与第一个项目的最小差异


请注意,如果您有

l1 = [datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.000-0400') for x in list1]
l2 = [datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.000-0400') for x in list2]

您的整个代码可以使用列表推导式写在一行中:

k = [min([v2 - v1 for v2 in l2 if v2>v1]) for v1 in l1]

成为l1l2 您的datetime 对象列表。这会产生

0:49:36 # k[0]
3 days, 6:23:07 # k[1]

【讨论】:

Hey RafaelC,非常感谢您在这里的输入: aux_list = [] 是我正在寻找的,非常感谢! 很高兴我能帮上忙 :) ! 谢谢拉斐尔,一个附带的问题,我如何对 k 列表中的 timedelta 对象求和?我可以使用 k[0] + k[1],但是如果我有超过 2 个结果怎么办,整个列表是否有 sum() 之类的函数?我已经尝试过了,但是 +: 'int' 和 'datetime.timedelta' 的操作数类型不受支持 是的@Wayne。试试sum(list3[0], datetime.timedelta()) 非常感谢您在这里的时间和详细的解释,它终于像魅力一样起作用了!【参考方案2】:

首先,Python 不知道字符串代表日期。您不能只是将数据放入字符串中并期望解释器知道您想要什么。所以,你只会得到一个错误,因为“-”运算符对字符串没有任何意义。

如果你想比较两个日期,我建议阅读 Python 的内置日期时间模块:https://docs.python.org/2/library/datetime.html

【讨论】:

感谢您回复我,我已经更新了代码。【参考方案3】:

如果你想同时迭代这两个列表,你可以zip 它们并同时迭代它们。然后比较这些值并将您想要的值附加到结果列表中。

list1 = [1, 2, 3]
list2 = [0, 3]
list3 = []
for (x, y) in zip(list1, list2):
    z = min(x, y) 
    list3.append(z)

请注意,结果将是较小列表的大小,在本例中为 list2。

【讨论】:

以上是关于Python 两个 For 循环中的两个列表的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何使用 for 循环合并两个列表,如 zip

如何在列表理解python中构建两个for循环

python 如何在一个for循环中遍历两个列表

Python:利用for循环比较两个列表元素的异同进而找出共有元素各自不同元素并全部导出到csv文件实现代码

使用两个嵌套的 for 循环和 str() 函数将列表中的偶数相加

使用for循环将两个列表中的数据插入到dict [重复]