将元组的成员与列表成员python相匹配

时间:2012-02-10 16:33:08

标签: python tuples

我认为这将是相当微不足道的,但结果却比我预想的要困难得多。

我有一个元组列表:

  tuples = [('apples', 2, 'apple'), ('oranges', 3, 'orange')]

我有一个行列表,其中包含元组列表中元组的可能成员:

 list_of_lines = ['banana 1234', 'apple 5678', 'oranges 4321','apples 8765', 'orange 1111')]

对于元组中的元组[0]和元组[2],我需要匹配list_of_lines中第一个位置的成员并获取该成员的值(在第二个位置)。关键是将这些结果输出到一行。例如,对于元组中的第一个元组,所需的输出将是:

 'apples', 8765, 2, 'apple',5678

即。元组的原始成员,现在具有与list_of_lines匹配的值。

如果我们尝试用

执行此操作
  for tup in tuples:
    for line in list_of_lines:
        if tuple[0] == line.split()[0]:
            print tuple[0], line.split()[1]
        if tuple[2] == line.split()[0]:
            print tuple[2], line.split()[1]

然后一行什么都没有,我们得到重复的匹配。

4 个答案:

答案 0 :(得分:2)

如果您先将list_of_lines转换为字典,则会更容易。

>>> tuples = [('apples', 2, 'apple'), ('oranges', 3, 'orange')]
>>> list_of_lines = ['banana 1234', 'apple 5678', 
...                  'oranges 4321','apples 8765']
>>> line_no = dict(x.split() for x in list_of_lines)
>>> result = [(x[0], line_no.get(x[0], None), x[1], 
               x[2], line_no.get(x[2], None)) for x in tuples]
>>> result
[('apples', '8765', 2, 'apple', '5678'), ('oranges', '4321', 3, 'orange', None)]

答案 1 :(得分:0)

不是每次需要查找条目时都扫描list_of_lines,而是将列表预处理到字典中更容易:

tuples = [('apples', 2, 'apple'), ('oranges', 3, 'orange')]
list_of_lines = list_of_lines = ['banana 1234', 'apple 5678', 'oranges 4321','apples 8765', 'orange 1111']
d = dict(l.split() for l in list_of_lines)
for t in tuples:
    print "'%s', %s, %s, '%s', %s" % (t[0], d[t[0]], t[1], t[2], d[t[2]])

打印出来:

'apples', 8765, 2, 'apple', 5678
'oranges', 4321, 3, 'orange', 1111

答案 2 :(得分:0)

尝试对变量和事后print语句进行存在性检查,以确保它们位于同一行。

tuples = [('apples', 2, 'apple'), ('oranges', 3, 'orange')]
list_of_lines = ['banana 1234', 'apple 5678', 'oranges 4321','apples 8765']
for tup in tuples:
    first = False
    second = False
    for line in list_of_lines:
        if tup[0] == line.split(' ')[0]:
            first = tup[0] , line.split()[1]
        if tup[2] == line.split(' ')[0]:
            second = tup[2] , line.split()[1]
        if first and second:
            print first + second

输出是: ('apples', '8765', 'apple', '5678')

我不太确定我是否理解这个问题,但我希望这能让你朝着正确的方向前进。

答案 3 :(得分:0)

我会试一试:

for tup in tuples:
    matches = []
    for line in list_of_lines:    
        if tup[0] == line.split()[0]:
            matches.append([tup[0], str(line.split()[1]), str(tup[1])])
        if tup[2] == line.split()[0]:
            matches.append([tup[2], str(line.split()[1])])
    if len(matches) > 0:
        matches = [", ".join(x) for x in matches]
        print ", ".join(matches)

输出是:

apple, 5678, apples, 8765, 2
oranges, 4321, 3