在Python中列出交集和部分字符串匹配

时间:2017-06-30 09:51:55

标签: python list-comprehension string-matching

所以我有2个列表,第一个来自我的数据集,并包含日期 - 时间格式为'yyyy-mm-dd hh:mm',名为times。示例:

'2010-01-01 00:00', '2010-01-01 00:15', '2010-01-01 00:30', ...,

另一个是所有唯一年份月份组合的列表,名为year_and_month。例如:

'2010-01', '2010-02', '2010-03', '2010-04',

所以我尝试在原始数据集中提取年 - 月组合的所有索引。我使用最糟糕的方式(python中的新方法),即

each_member_indices = []
for i in range(len(year_and_month)):
    item_ind = []
    for j in range(times.shape[0]):
        if year_and_month[i] in times[j]:
            item_ind.append(j)

each_member_indices.append(item_ind)

现在,这是一个耗费大量时间工作的核武器。所以我想稍微优化它,因此我正在研究一些实现,如 问题是Find intersection of two lists?Python: Intersection of full string from list with partial string

res_1 = [val for val in year_and_month if val in times]

产生一个空列表,而

res_1 = [val for val in year_and_month if val in times[0]]

至少产生第一个成员。

有什么想法吗?

修改

我只需要名为times的原始数据集中元素的索引,这些元素对应year_and_month列表的唯一年 - 月对。因此,根据要求,样本输出将是

[[0, 1, 2, 3,...],[925, 926, ...],...]

第一个子列表包含2010年1月对的索引,2010年2月的第二个索引,依此类推。

4 个答案:

答案 0 :(得分:0)

也许尝试使用任何?

[val for val in year_and_month if any(val in t for t in times)]

答案 1 :(得分:0)

为什么不用字典创建一个新结构并按year_and_month命令呢?

result = {}
for i, v in enumerate(times):
    result.setdefault(v[:7], []).append(i)
for i in year_and_month:
     print(i, result[i]) #will print the year_month with all the indices of that year_month

答案 2 :(得分:0)

要在线性时间内完成此操作,您可以构建一个查找字典,将年和月组合映射到索引。您还可以使用collections.defaultdict使其更容易:

from collections import defaultdict

d = defaultdict(list)
for i, v in enumerate(times):
    d[v[:7]].append(i)

然后,您可以使用列表推导创建结果列表:

result = [d[x] for x in year_and_month]

演示:

>>> from collections import defaultdict
>>> times = ['2010-01-01 00:00', '2010-01-01 00:15', '2010-02-01 00:30', '2010-03-01 00:00']
>>> year_and_month = ['2010-01', '2010-02', '2010-03', '2010-04']
>>> d = defaultdict(list)
>>> for i, v in enumerate(times):
...     d[v[:7]].append(i)
...     
>>> dict(d)
{'2010-01': [0, 1], '2010-02': [2], '2010-03': [3]}
>>> [d[x] for x in year_and_month]
[[0, 1], [2], [3], []]

答案 3 :(得分:0)

好吧,这给出了共同的元素:

ls = str(times)
r = [x for x in year_and_month if (x in ls)]
print r