2012-02-10 83 views
1

我认为这将是相当平凡的,但事实证明比我预期的更困难。将元组的元素匹配到列表的成员,python

我有元组的列表:

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] 

那么什么都做,这是一个线,我们得到了反复的比赛。

+0

你list_of_lines包含了 “橙色” 没有定义。在真正的问题中是否会出现问题,或者在这种情况下是否需要打印任何内容? – DSM 2012-02-10 16:37:43

+0

我会用一个字典,你的水果是你的钥匙,你的价值是你想要的数字。 – Jeff 2012-02-10 16:49:04

+0

@DSM对不起,只是编辑 – Renklauf 2012-02-10 16:59:49

回答

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 
+0

KeyError'orange'呢? – 2012-02-10 16:57:34

+0

@Max Li:list_of_lines中实际上没有缺失值。我编辑了OP来反映这一点。对困惑感到抱歉。 – Renklauf 2012-02-10 17:05:41

+0

@aix:这太好了。我甚至没有想到,字典查找可以这样完成。 – Renklauf 2012-02-10 17:06:47

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)] 
+0

你真的试过你的代码吗?语法和结果都有错误。 “result = [('oranges','4321',3,'orange',None)]” – 2012-02-10 17:00:15

+0

@MaxLi是的,我确实尝试了代码。我从OP中复制了'tuples'和'list_of_lines'。好像他有一个额外的支架,我现在删除。但其余的代码确实有效。结果确实包括“苹果”等。你是什么意思结果的错误? – 2012-02-10 17:08:56

+0

@MaxLi啊我明白你的意思了。但不是我的错误。 OP已经编辑了这篇文章,并在*我回答后添加了“orange,1111”*。但基于我上面所示的输入,答案是正确的,逻辑也是如此。 – 2012-02-10 17:13:22

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

不太清楚,如果我的理解这个问题,但我希望这让你在正确的方向。

+0

请阅读问题:输出必须是:('苹果',8765,2,'苹果',5678),而不是'苹果','8765','苹果','5678') – 2012-02-10 17:03:56

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 
相关问题