Iterace nad seznamem celých čísel a spojování položek na základě stavu

0

Otázka

Pokouším se iterovat přes to seznam celých čísel a připojit se k nim na základě stavu pomocí python standardní knihovny. Například mám seznam celých čísel, který vypadá takto:

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

Já bych chtěl iterovat přes tento seznam a kombinovat hodnoty tak, že výsledkem bude řetězec ve tvaru:

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

(tam, kde jsou pomlčky v ceně). Podmínkou pro to je, že pokud předchozí číslo není rovno nule pomlčka musí být umístěn v přední části. Pokud další hodnota je rovna nule, je připojil do konce hodnotu než to.

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

Nejlepší odpověď

2

To by pomohlo: (Vzhledem k tomu, čísla jsou pozitivní v daném seznamu)

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. Převést každý prvek negativní, ve které:
    • 9 stává -9
    • 0 nemá žádný vliv, jako -0 je 0 v pythonu
  2. Pak je převést do řetězce a připojit se k nim
  3. Ujistěte se, že odstranit Koncové hyphenv našem případě lstrip('-') pomáhá nám s tím.
2021-11-23 04:48:25

Vezměte prosím na vědomí, co jsi udělal a proč to funguje. To dělá to lepší pro ostatní, kteří mohou narazit na tuto stránku později.
krmogi

Vaše odpověď by mohla být zlepšena s další podpůrné informace. Prosím, upravit, přidat další podrobnosti, jako jsou citace nebo dokumentace, tak, že ostatní mohou potvrdit, že vaše odpověď je správná. Můžete si najít více informací o tom, jak psát dobré odpovědi v centru nápovědy.
Community
1

Přímočarý přístup, budování řetězec ze seznamu celých čísel, následuje jednoduchý regulární výraz, náhrada:

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

Zřetězení je to, co jsem našel, ostatní v pořadí, jak řešit problémy podobné. Ve skutečnosti jsem si jistý, že jsem viděl řešení velmi podobné. Myslím, že jeden detail, který jsem nezmínil, je, že hodnoty v tomto seznamu celých čísel má schopnost změnit na libovolnou hodnotu od 0-9. Co se stane, když druhá položka seznamu je nyní 1. je tam tak jako tak, aby automatizovat zřetězení proces tak, že výsledek by nyní být #0-10-20-4-60-8000-1-9
42Dugg

@Dugg jsem aktualizovány s další odpověď.
Tim Biegeleisen

Tento, stejně jako další odpověď výše, funguje skvěle, nicméně, je-li seznam změnil tak, že první položka seznamu je nyní 1, výsledek je #-100-20-4-60-8000-1-9 kde pomlčka je bohužel umístěn na samém začátku. Existuje nějaký způsob, jak odstranit, že z děje tak, že výsledek by byl #100-20-4-60-8000-1-9? Také jste byly tuny pomoci tak daleko. Děkuji!!!
42Dugg

@42Dugg Podívejte se na aktualizované odpověď. Můžeme přidat pozitivní lookbehind, který tvrdí, že čárky jsou jen přidány pro jiné znaky než ten první.
Tim Biegeleisen
0

Tady je jednoduché řešení:

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

Pro každou položku v seznamu, budeme zkontrolujte, zda položka není rovno 0. Pokud to není rovno 0, můžeme vytisknout položky s pomlčkou před ním, a použít end parametr, aby se zabránilo nové linky. Pokud je 0, jsme jednoduše vytisknout položky.

2021-11-23 04:35:53
0

Pomocí smyčky:

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

To funguje skvěle, nicméně, je-li seznam změnil tak, že první položka seznamu je nyní 1, výsledek je #-100-20-4-60-8000-1-9 kde pomlčka je bohužel umístěn na samém začátku. Existuje nějaký způsob, jak odstranit, že z děje tak, že výsledek by byl #100-20-4-60-8000-1-9? Díky!!!
42Dugg

Omlouvám se za chybějící že okrajový případ. Můžeme jednoduše přidat podmínku přeskočit první číslo. Upravil jsem kód odpovídajícím způsobem.
Tyler Liu

V jiných jazycích

Tato stránka je v jiných jazycích

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