将str元素从列表耦合到元组列表

时间:2019-01-15 14:17:06

标签: python list tuples element coupling

我有以下列表:

lines
['line_North_Mid', 'line_South_Mid',
 'line_North_South', 'line_Mid_South',
 'line_South_North','line_Mid_North' ]

关于它们的名称,我想将它们按照以下方式在元组列表中配对:

tuple_list
[('line_Mid_North', 'line_North_Mid'),
 ('line_North_South', 'line_South_North'),
 ('line_Mid_South', 'line_South_Mid')]

我想也许我可以在lines的元素中进行字符串搜索,但是效率不高。是否有更好的方式以lines

的形式对tuple_list元素进行排序

配对条件:

如果两个元素都具有相同的Area_name:('North', 'Mid', 'South')

例如:'line_North_Mid'应该与'line_Mid_North'结合

4 个答案:

答案 0 :(得分:2)

使用collections.defaultdict可以实现与订单无关的O( n )解决方案。想法是使用由from collections import defaultdict L = ['line_North_Mid', 'line_South_Mid', 'line_North_South', 'line_Mid_South', 'line_South_North', 'line_Mid_North'] dd = defaultdict(list) for item in L: dd[frozenset(item.rsplit('_', maxsplit=2)[1:])].append(item) res = list(map(tuple, dd.values())) # [('line_North_Mid', 'line_Mid_North'), # ('line_South_Mid', 'line_Mid_South'), # ('line_North_South', 'line_South_North')] 分隔的字符串的最后2个部分作为我们的字典键,并在输入列表中附加值。然后提取值并转换为元组列表。

{{1}}

答案 1 :(得分:2)

尝试一下:

from itertools import combinations

tuple_list = [i for i in combinations(lines,2) if i[0].split('_')[1] == i[1].split('_')[2] and i[0].split('_')[2] == i[1].split('_')[1]]

或者我认为这样更好:

[i for i in combinations(lines,2) if i[0].split('_')[1:] == i[1].split('_')[1:][::-1]]

答案 2 :(得分:1)

您可以使用以下列表理解:

lines = ['line_Mid_North', 'line_North_Mid',
         'line_North_South', 'line_South_North',
         'line_Mid_South', 'line_South_Mid']

[(j,i) for i in lines for j in lines if j not in i 
       if set(j.split('_')[1:]) < set(i.split('_'))][::2]

[('line_Mid_North', 'line_North_Mid'),
 ('line_North_South', 'line_South_North'),
 ('line_Mid_South', 'line_South_Mid')]

答案 3 :(得分:1)

我建议您有一个函数,该函数为应该在一起的字符串返回相同的键(分组键)。

def key(s):
    # ignore first part and sort other 2 parts, so they will always be in same order
    _, part_1, part_2 = s.split('_')
    return tuple(sorted([part_1, part_2]))

您必须使用某种分组方法;我以defaultdict为例:

import collections

lines = [
    'line_North_Mid', 'line_South_Mid',
    'line_North_South', 'line_Mid_South',
    'line_South_North','line_Mid_North',
]

dd = collections.defaultdict(list)
for s in lines:
    dd[key(s)].append(s)     # those with same key get grouped

print(list(tuple(v) for v in dd.values()))
# [
#     ('line_North_Mid', 'line_Mid_North'),
#     ('line_South_Mid', 'line_Mid_South'),
#     ('line_North_South', 'line_South_North'),
# ]