将列表中的 str 元素耦合到元组列表

coupling str elements from a list to a tuple list

我有以下列表:

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'

结合使用

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

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')]

使用 collections.defaultdict 可以实现与顺序无关的 O(n) 解决方案。我们的想法是使用由 '_' 分隔的字符串的最后 2 个组件作为我们的字典键,附加输入列表中的值。然后提取值并转换为元组列表。

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')]

试试这个:

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]]

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

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'),
# ]