Идиоматическая Python-версия кода Ruby с циклом while, который проверяет оператор? - PullRequest
1 голос
/ 14 марта 2012

В следующем коде Ruby-код будет перебирать исходную строку и создавать список совокупных слов, разделенных символом '.'символ, отличный от тех, которые следуют за последним '.'.

Например, укажите исходную строку 'Company.Dept.Group.Team', результатом будет ... ["Company.Dept.Group", "Company.Dept", "Company"]

Учитывая, что цикл while в Python (я полагаю) будет проверять только выражение, а не утверждение, как показано ниже, как лучше написать это в идиоматическом Python?

#ruby
source = 'Company.Dept.Group.Team'
results = []

temp = source.clone
while (i = temp.rindex('.'))  # test statement not supported in Python?
  temp = temp[0...i]
  results << temp
end

p results   # >> ["Company.Dept.Group", "Company.Dept", "Company"]

Ответы [ 5 ]

2 голосов
/ 14 марта 2012

Идиома Python выглядит примерно так:

while True:
    i = temp.rindex('.')
    if not i:
        break
    ...
1 голос
/ 14 марта 2012

Чтобы сделать это в целом, я бы, вероятно, сделал:

source = 'Company.Dept.Group.Team'
split_source = source.split('.')
results = ['.'.join(split_source[0:x]) for x in xrange(len(split_source) - 1, 0, -1)]
print results

Дословный перевод будет больше похож на:

source = 'Company.Dept.Group.Team'

temp = source
results = []
while True:
    i = temp.rfind('.')
    if i < 0:
        break
    temp = temp[0:i]
    results.append(temp)

print results

Или, если вы предпочитаете:

source = 'Company.Dept.Group.Team'

temp = source
results = []
try:
    while True:
        temp = temp[0:temp.rindex('.')]
        results.append(temp)
except ValueError:
    pass
print results

Или:

source = 'Company.Dept.Group.Team'

temp = source
results = []
i = temp.rfind('.')
while i > 0:
    temp = temp[0:i]
    results.append(temp)
    i = temp.rfind('.')

print results

Как вы указали, тот факт, что вы не можете рассматривать присваивание как выражение, делает эти случаи немного неэлегансными. Я думаю, что первые случаи (например, «Верно») встречаются чаще, чем последние.

Для дополнительной информации, этот пост выглядит довольно хорошо: http://effbot.org/pyfaq/why-can-t-i-use-an-assignment-in-an-expression.htm

1 голос
/ 14 марта 2012

Если вы привыкнете к Python, вы увидите повсеместные списки и итераторы / генераторы!

Python может быть

source = 'Company.Dept.Group.Team'

# generate substrings
temp = source.split(".")
results = [".".join(temp[:i+1]) for i,s in enumerate(temp)]

# pop the team (alternatively slice the team out above)
results.pop()

# reverse results
result.reverse()

print result # should yield ["Company.Dept.Group", "Company.Dept", "Company"]

, но, скорее всего, существуют идиоматические решения ...

1 голос
/ 14 марта 2012
>>> source = 'Company.Dept.Group.Team'
>>> last = []
>>> [last.append(s) or '.'.join(last) for s in source.split('.')[:-1]]
['Company', 'Company.Dept', 'Company.Dept.Group']
0 голосов
/ 14 марта 2012

Я бы сделал

>>> import re
>>> source = 'Company.Dept.Group.Team'
>>> results = [source[:m.start()] for m in re.finditer(r"\.", source)]
>>> results
['Company', 'Company.Dept', 'Company.Dept.Group']

(используйте reversed(results), если вы хотите, чтобы заказ был отменен).

Более или менее буквальный перевод вашего кода на Python будет

source = 'Company.Dept.Group.Team'
results = []
temp = source

while True:
    try:
        i = temp.rindex('.')
        temp = temp[:i]    
        results.append(temp)
    except ValueError:
        break
print(results)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...