Iterar sobre uma lista de números inteiros e juntando os itens com base em uma condição

0

Pergunta

Eu estou tentando para iterar sobre uma lista de números inteiros e para uni-las com base em uma condição usando a biblioteca python padrão. Por exemplo, eu tenho uma lista de inteiros que se parece como tal:

listOfIntegers = [0, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]

Eu gostaria de iterar através desta lista e combinar valores de tal forma que o resultado seria uma seqüência de caracteres do formulário:

result = '000-20-4-60-8000-1-9'

(onde os traços são incluídos). A condição para isso é que, se o número anterior não é igual a zero um traço devem ser colocados na frente dele. Se o próximo valor é igual a zero, é juntou-se ao final o valor antes.

integer iteration list python
2021-11-23 03:49:53
4

Melhor resposta

2

Isto iria ajudar: (Considerando números são positivos na lista)

def join(lst):
    return "".join(list(map(lambda x: str(-x), lst))).lstrip('-')

listOfIntegers = [0, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]
print(join(listOfIntegers)) # 000-20-4-60-8000-1-9

O processo:

  1. Converter cada elemento negativo, em que:
    • 9 torna-se -9
    • 0 não tem efeito como -0 é 0 em python
  2. Em seguida, convertê-los em cadeias de caracteres e junte-se a eles
  3. Certifique-se de remover à Direita hyphenno nosso caso, lstrip('-') ajuda-nos com isso.
2021-11-23 04:48:25

Por favor, note que você fez e porque funcionou. Isso o torna melhor para outras pessoas que possam se deparar com essa página mais tarde.
krmogi

A sua resposta poderia ser melhorado com suporte adicionais de informações. Por favor, editar para adicionar mais detalhes, como o número de citações ou da documentação, para que outras pessoas possam confirmar que a sua resposta está correcta. Você pode encontrar mais informações sobre como escrever boas respostas no centro de ajuda.
Community
1

Uma abordagem simples, a construção de uma cadeia de caracteres a partir da lista de números inteiros, seguido por uma regex simples substituição:

listOfIntegers = [1, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]
inp = ''.join([str(x) for x in listOfIntegers])
result = re.sub(r'(?<=.)(?=[^\D0])', '-', inp)
print(result)  # 100-20-4-60-8000-1-9
2021-11-23 04:07:00

Concatenação é o que eu encontrei outros o fizeram, a fim de resolver problemas semelhantes a este. Na verdade, eu tenho certeza que eu vi uma solução muito semelhante a este. Suponho que um detalhe que eu não mencionar é que os valores dentro da lista de números inteiros, tem a capacidade de mudar para qualquer valor de 0 a 9. O que acontece se a segunda entrada da lista é agora um 1. existe uma maneira de automatizar o processo de concatenação de tal forma que o resultado seria agora #0-10-20-4-60-8000-1-9
42Dugg

@Dugg eu tenho atualizado com outra resposta.
Tim Biegeleisen

Este outro, como resposta acima funciona muito bem, no entanto, se a lista é alterada de tal forma que a primeira entrada da lista é agora um 1, o resultado é #-100-20-4-60-8000-1-9 onde um traço, infelizmente, é colocado no início. Existe alguma maneira de eliminar o que aconteça tal que o resultado seria #100-20-4-60-8000-1-9? Além disso, você tem sido uma tonelada de ajuda até agora com isso. Obrigado!
42Dugg

@42Dugg Verificar a resposta atualizado. Podemos adicionar um positivo de recuo, que afirma que os traços são adicionados apenas para caracteres do que o primeiro.
Tim Biegeleisen
0

Aqui está uma solução simples:

listOfIntegers = [0, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]

for i in listOfIntegers:
    if i != 0:
        print("-" + str(i), end="")
    else:
        print(str(i), end="")

Para cada item na lista, vamos verificar se o item não for igual a 0. Se ele não for igual a 0, podemos imprimir o item com um traço na frente, e use o end parâmetro para evitar novas linhas. Se for 0, nós simplesmente imprima o item.

2021-11-23 04:35:53
0

Usando um loop:

def func(nums):
    result = ''
    for i, num in enumerate(nums):
        if num != 0 and i != 0:
            result += '-'
        result += str(num)
    return result
2021-11-23 03:55:07

Isso funciona, ótimo, no entanto, se a lista é alterada de tal forma que a primeira entrada da lista é agora um 1, o resultado é #-100-20-4-60-8000-1-9 onde um traço, infelizmente, é colocado no início. Existe alguma maneira de eliminar o que aconteça tal que o resultado seria #100-20-4-60-8000-1-9? Obrigado!
42Dugg

Desculpem a falta de borda do caso. Podemos simplesmente adicionar uma condição para ignorar o primeiro número. Que eu tenha editado o código apropriadamente.
Tyler Liu

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................