迭代列表列表并忽略字符串,如果它们出现在更大的字符串中 - Python

时间:2015-03-16 23:45:02

标签: python string list

我想迭代列表列表,并检查第二个位置中的任何字符串是否位于第二个位置的任何其他字符串中。如果是,他们将被跳过。然后我只想将第一个位置的字符串作为一个更大的字符串返回。这需要使用列表中的任何字符串。

这个描述很可怕,所以这是一个例子。

record = [['436', 'University'], ['123', 'University Hospital'], ['956', 'School']]

我想要的输出是:

'123 956'

这是因为"大学"在大学医院",所以我不需要与之相关的号码。

我没有找到解决方案的运气,这是我能做的最好的事情:

final_string = ''
for inst in record:
    if inst[1] not in record:
         final_string = final_string + inst[0] + ' '

返回第一个位置的所有字符串,即

'436 123 956 '

3 个答案:

答案 0 :(得分:2)

这可行。

for i, inst in enumerate(record):
    append = True
    for rec in (x[1] for x in record[i + 1:]):
        if inst[1] in rec:
            append = False
            break
    if append:
        final_string = final_string + inst[0] + ' '

为了进行一些性能改进,您可以缓存已经搜索过的单词,但那是另一个主题!

希望它有所帮助!

答案 1 :(得分:2)

这是浓缩的,但效率不高:

record = [['436', 'University'], ['123', 'University Hospital'], ['956', 'School']]

d = {k:v for (v,k) in record}
toks = [v for (k,v) in d.iteritems() if sum(1 for kk in d if k in kk) < 2]

print toks            # ['123', '956'] (as a list)
print ' '.join(toks)  # 123 956        (as a string, space separated)

答案 2 :(得分:1)

如果您在效率方面寻求简约性,那么这将在一行中完成:

>>> record = [['436', 'University'], ['123', 'University Hospital'], ['956', 'School']]
>>> ' '.join(x[0] for x in record if not [x[1] in s for s in (y[1] for y in record)].count(True) > 1)
'123 956'