Przesada listy liczb całkowitych i łączenie elementów w oparciu o warunki

0

Pytanie

Próbuję uporządkować listę liczb całkowitych i połączyć je w oparciu o warunki, przy użyciu standardowej biblioteki pythona. Na przykład, mam listę liczb całkowitych, który wygląda tak:

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

Chciałbym powtórzyć tę listę i połączyć wartości w taki sposób, aby wynikiem był wiersz formularza:

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

(gdzie zawarte kreska). Warunek ten polega na tym, że jeśli ta liczba nie jest równa zeru, przed nim należy umieścić kreska. Jeśli następna wartość jest równa zero, to dołącza się do końca wartości przed nim.

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

Najlepsza odpowiedź

2

To by pomogło: (Biorąc pod uwagę, że liczby w tym liście pozytywne)

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

Proces:

  1. Przekształć każdy element negatywny, w którym:
    • 9 staje się -9
    • 0 nie ma żadnego efektu, ponieważ -0 jest 0 w języku python
  2. Następnie przekształć je w wiersze i połączyć je
  3. Koniecznie usuń trailing hyphenw naszym przypadku lstrip('-') pomaga nam w tym.
2021-11-23 04:48:25

Proszę zwrócić uwagę na to, co zrobiłeś i dlaczego to działa. To sprawia, że lepiej dla innych, którzy mogą zmierzyć się z tą stroną później.
krmogi

Odpowiedź może być ulepszony za pomocą więcej informacji uzupełniających. Proszę, edytuj, aby dodać dodatkowe informacje, takie jak cytaty lub dokumentacji, aby inni mogli potwierdzić poprawność swojej odpowiedzi. Można znaleźć bardziej szczegółowe informacje o tym, jak pisać dobre odpowiedzi, w centrum pomocy.
Community
1

Proste podejście, budowa wiersza z listy liczb całkowitych z kolejnych prosty wymianą wyrażenia regularnego:

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

Zjednoczenie to jest to, co, jak uważam, robili inne rozwiązania podobnych problemów. Właściwie jestem prawie pewien, że widziałem rozwiązanie, bardzo podobny do tego. Przypuszczam, że jeden szczegół, który nie wspomniałem, polega na tym, że wartości w tym liście liczb całkowitych mogą ulec zmianie na dowolną wartość od 0 do 9. Co się stanie, jeśli drugi wpis listy teraz równa 1. czy jest jakiś sposób zautomatyzować proces łączenia w taki sposób, aby wynik był #0-10-20-4-60-8000-1-9
42Dugg

@Dugg zaktualizowałem inną odpowiedź.
Tim Biegeleisen

Ten, a także inną odpowiedź wyżej działa, jednak, jeśli lista zmieniony w ten sposób, że pierwszy wpis na liście jest teraz równa 1, wynik będzie #-100-20-4-60-8000-1-9 gdzie kreska, niestety, stawia się na samym początku. Czy jest jakiś sposób zapobiec temu, aby wynik był #100-20-4-60-8000-1-9? Ponadto, do tej pory miały ogromną pomoc w tym. Dziękuję!
42Dugg

@42Dugg Sprawdź zaktualizowany odpowiedź. Możemy dodać pozytywny wygląd, który twierdzi, że kreski są dodawane tylko do znaków innych niż pierwszego.
Tim Biegeleisen
0

Oto proste rozwiązanie:

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="")

Dla każdego elementu na liście możemy sprawdzić, nie, czy dany element jest równy 0. Jeśli ono nie jest równe 0, możemy распечатываем element z kreska przed nim i wykorzystujemy end parametr, który pozwala uniknąć pojawienia się nowych wierszy. Jeśli jest on równy 0, możemy po prostu распечатываем towar.

2021-11-23 04:35:53
0

Korzystanie z cyklu:

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

Działa to dobrze, jeśli jednak lista zmieniony w ten sposób, że pierwszy wpis na liście jest teraz równa 1, wynik będzie #-100-20-4-60-8000-1-9 gdzie kreska, niestety, stawia się na samym początku. Czy jest jakiś sposób zapobiec temu, aby wynik był #100-20-4-60-8000-1-9? Dziękuję!
42Dugg

Przepraszam, że przegapiłem ten skrajny przypadek. Możemy po prostu dodać warunek, aby pominąć pierwszą liczbę. Jestem odpowiednio edytowany przez kod.
Tyler Liu

W innych językach

Ta strona jest w innych językach

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