jak dodać wartość do krotki?

80

Pracuję nad skryptem, w którym mam listę takich krotek ('1','2','3','4'). na przykład:

list = [('1','2','3','4'),
        ('2','3','4','5'),
        ('3','4','5','6'),
        ('4','5','6','7')]

Teraz trzeba dodać '1234', '2345', '3456'i '4567'odpowiednio na końcu każdej krotki. na przykład:

list = [('1','2','3','4','1234'),
        ('2','3','4','5','2345'),
        ('3','4','5','6','3456'),
        ('4','5','6','7','4567')]

Czy jest to w jakikolwiek sposób możliwe?

Shahzad
źródło
8
rozwiązanie wielojęzyczne? ;)
Snowbear
2
Witamy w StackOverflow! Po prawej stronie, gdy zadawałeś swoje pytanie, było to przydatne pudełko Jak sformatować . Warto przeczytać, podobnie jak strona, do której prowadzi link z [?] Tuż nad obszarem pytań.
TJ Crowder,
3
Przynajmniej w Pythonie krotki są niezmienne. Jeśli chcesz „dodać coś do krotki”, dlaczego nie użyć zmiennej struktury danych od samego początku?
Felix Kling
2
Ja też to robię - najczęściej z „plikiem”, ponieważ „dla pliku w plikach” jest cholernie naturalne! - ale generalnie powinieneś raczej unikać nazywania swoich list „listą”, która zastępuje wbudowaną „listę”.
DSM

Odpowiedzi:

138

Krotki są niezmienne i nie powinny być zmieniane - do tego służy typ listy. Możesz zastąpić każdą krotkę przez originalTuple + (newElement,), tworząc w ten sposób nową krotkę. Na przykład:

t = (1,2,3)
t = t + (1,)
print t
(1,2,3,1)

Ale raczej sugerowałbym używanie list od początku, ponieważ są one szybsze do wstawiania elementów.

I jeszcze jedna wskazówka: nie nadpisuj wbudowanej nazwy listw swoim programie, raczej wywołaj zmienną llub jakąś inną nazwę. Jeśli nadpiszesz wbudowaną nazwę, nie możesz jej już używać w bieżącym zakresie.

AndiDog
źródło
23
Skrótt += 1,
1
Doskonałe punkty, jednak jestem w niefortunnej sytuacji, w której chcę iteracyjnie dodawać wartości do sqlite3bazy danych i muszę utworzyć krotkę wartości do dodania (ponieważ wymagana składnia to VALUES (v1, v2, v3, ...). W tym przypadku wiedza, jak dodawać wartości do krotka jest bardzo korzystna
mgławica HS
16

Na podstawie składni domyślam się, że to Python. Celem krotki jest to, że jest ona niezmienna, więc musisz zastąpić każdy element nową krotką:

list = [l + (''.join(l),) for l in list]
# output:
[('1', '2', '3', '4', '1234'), 
 ('2', '3', '4', '5', '2345'), 
 ('3', '4', '5', '6', '3456'), 
 ('4', '5', '6', '7', '4567')]
atp
źródło
5
To oczywiście działa. Ale czy naprawdę należy to zrobić? Zastanawiam się. Ponieważ to niweczy cel posiadania krotki na pierwszym miejscu. A może się mylę?
user225312
9

W Pythonie nie możesz. Krotki są niezmienne.

Na liście zawierającej możesz jednak zastąpić krotkę ('1', '2', '3', '4')inną ('1', '2', '3', '4', '1234')krotką.

Pablo Santa Cruz
źródło
9

Jak wspomniano w innych odpowiedziach, po utworzeniu krotki są niezmienne, a lista może lepiej służyć Twoim celom.

To powiedziawszy, inną opcją tworzenia nowej krotki z dodatkowymi elementami jest użycie operatora splat:

new_tuple = (*old_tuple, 'new', 'items')

Podoba mi się ta składnia, ponieważ wygląda jak nowa krotka, więc jasno komunikuje, co próbujesz zrobić.

Korzystając ze splat, potencjalnym rozwiązaniem jest:

list = [(*i, ''.join(i)) for i in list]

Terrabity
źródło
7

Jak odpowiedzieli inni ludzie, krotki w Pythonie są niezmienne, a jedynym sposobem na ich „zmodyfikowanie” jest utworzenie nowej z dołączonymi elementami.

Ale najlepszym rozwiązaniem jest lista. Gdy trzeba wywołać jakąkolwiek funkcję lub metodę, która wymaga krotki, utwórz krotkę, używając krotki (listy).

Ryan
źródło
4

Omówiłem kilka szczegółów związanych z tuplei listi zrozumiałem, że:

  • Krotki są Heterogeneoustypem danych kolekcji
  • Krotka ma stałą długość (na typ krotki)
  • Krotki są zawsze skończone

Aby dołączyć nowy element do krotki, należy go rzucić na niego listi wykonać append()na nim operacje, a następnie ponownie przesłać go z powrotem do krotki.

Ale osobiście, co czułem o pytanie, czy Krotki mają być skończone , stała długość przedmiotów, a jeśli używamy tych typów danych w naszych logiki aplikacji to nie powinno nie być scenariusz na dołączanie nowych elementów lub aktualizując wartość pozycji w to. Więc zamiast listy krotek powinna to być sama lista. Czy mam rację?

Dipak
źródło
1
Istnieją scenariusze, w których musisz przekazać krotkę do funkcji, na przykład za pomocą SQL (psycopg2) lub interakcji z R (rpy2). Funkcje nie zawsze działają poprawnie, jeśli otrzymają listę zamiast krotki. Czasami otrzymujesz także krotkę z funkcji, a nie z listy. Krotki mogą chronić przed omyłkową modyfikacją oryginalnej listy, gdy zamiast tego powinieneś pracować nad kopią listy. Zatem tak, listy pośrednio lub bezpośrednio są pośrednikami w przedstawionych odpowiedziach. Jednak rzutowanie z powrotem do krotki na końcu jest nadal logiczne w wielu scenariuszach.
Nate Wanner
2
    list_of_tuples = [('1', '2', '3', '4'),
                      ('2', '3', '4', '5'),
                      ('3', '4', '5', '6'),
                      ('4', '5', '6', '7')]


    def mod_tuples(list_of_tuples):
        for i in range(0, len(list_of_tuples)):
            addition = ''
            for x in list_of_tuples[i]:
                addition = addition + x
            list_of_tuples[i] = list_of_tuples[i] + (addition,)
        return list_of_tuples

    # check: 
    print mod_tuples(list_of_tuples)
Viktor
źródło
0
OUTPUTS = []
for number in range(len(list_of_tuples))):
    tup_ = list_of_tuples[number]
    list_ = list(tup_)  
    item_ = list_[0] + list_[1] + list_[2] + list_[3]
    list_.append(item_)
    OUTPUTS.append(tuple(list_))

WYDAJNOŚĆ jest tym, czego pragniesz

Questwalker
źródło