Python:在数组中查找常见字母而不切换单词

时间:2015-12-16 23:05:42

标签: python

这是我的(工作)代码:

groupes = [{'description': 'i am a letter', 'exemple': 'e1'},
           {'description': 'i am a brick', 'exemple': 'e2'},
           {'description': 'i am a dog', 'exemple': 'e3'}]
d = zip(*[g['description'] for g in groupes])
b = []
for a in d:
    if len(set(a)) == 1:
        b.append(set(a).pop())
    else:
        break
a = u''.join(b)
l = len(a)
print()
b = [u'{} "{}"'.format(b['description'][l:], b['exemple']) for b in groupes]
b = u', '.join(b).strip()
print(u'{} ({})'.format(a, b))

它输出所有共同的字母,并使用reste将其放在()中。 我的问题是当共同的字母停在一个单词的中间时,就像这样:

groupes = [{'description': 'i am a douche', 'exemple': 'e1'},
           {'description': 'i am a dandy', 'exemple': 'e2'},
           {'description': 'i am a dog', 'exemple': 'e3'}]

然后你会得到:

i am a d (ouche "e1", andy "e2", og "e3")

我希望得到

i am a (douche "e1", dandy "e2", dog "e3")

知道怎么做“python方式”吗?

1 个答案:

答案 0 :(得分:0)

添加:

if any(' ' != c for c in next(d,[])):
    while b[-1] != ' ':
        b.pop()
for循环之后

。这样:

  • 检查下一组字符中是否有任何不是空格的字符。如果有,那意味着至少有一个词被切断
  • 弹出b
  • 末尾不是空格的任何字符
  • 如果所有3个字符串相同,则next()通常会导致StopIteration错误,因此请确保[]默认

此外,您应该将print(u'{} ({})'.format(a, b))更改为print(u'{}({})'.format(a, b)),以避免在打印字符串中的(之前留出额外空间。

编辑 - 更好的方式?

比这更可靠的方法是将zip更改为:

d = zip(*[g['description'].split() for g in groupes])

分割每个字符串,而不是逐字逐句迭代。

请务必将join更改为:

a = u' '.join(b) #space instead of empty string

编辑 - 为什么*明星?

这用于参数解包。注意使用和不使用*:

传递列表(或在大多数情况下,任何可迭代的)之间的区别
>>> def foo(a= None, b = None, c = None):
    print('''
    a: %s
    b: %s
    c: %s
    ''' %(str(a),str(b),str(c)))


>>> test = [1,2,3]
>>> foo(test)

    a: [1, 2, 3]
    b: None
    c: None

>>> foo(*test)

    a: 1
    b: 2
    c: 3