3.6. Sequence GetItem¶
3.6.1. Rationale¶
Works with ordered sequences:
str
,list
,tuple
Index must
int
(positive, negative or zero)Positive Index starts with
0
Negative index starts with
-1
>>> data = 'abcd'
>>>
>>> data[0]
'a'
>>> data[1]
'b'
>>> data[-1]
'd'
>>> data[1.1]
Traceback (most recent call last):
TypeError: list indices must be integers or slices, not float
3.6.2. Positive Index¶
Starts with
0
Index must be less than length of an object
Ascending
>>> data = ['a', 'b', 'c', 'd']
>>>
>>> data[0]
'a'
>>> data[1]
'b'
>>> data[2]
'c'
>>> data[3]
'd'
>>>
>>> data[4]
Traceback (most recent call last):
IndexError: string index out of range
3.6.3. Negative Index¶
0
is equal to-0
Starts with
-1
Descending
Negative index starts from the end and go right to left
>>> data = ['a', 'b', 'c', 'd']
>>>
>>> data[-0]
'a'
>>> data[-1]
'd'
>>> data[-2]
'c'
>>> data[-3]
'b'
>>> data[-4]
'a'
>>>
>>> data[-5]
Traceback (most recent call last):
IndexError: string index out of range
3.6.4. Ordered Sequence¶
Get Item from str
:
>>> data = 'abcd'
>>>
>>> data[0]
'a'
>>> data[1]
'b'
>>> data[2]
'c'
>>> data[-0]
'a'
>>> data[-1]
'd'
>>> data[-2]
'c'
GetItem from list
:
>>> data = ['a', 'b', 'c', 'd']
>>>
>>> data[0]
'a'
>>> data[1]
'b'
>>> data[2]
'c'
>>> data[-0]
'a'
>>> data[-1]
'd'
>>> data[-2]
'c'
GetItem from tuple
:
>>> data = ('a', 'b', 'c', 'd')
>>>
>>> data[0]
'a'
>>> data[1]
'b'
>>> data[2]
'c'
>>> data[-0]
'a'
>>> data[-1]
'd'
>>> data[-2]
'c'
3.6.5. Unordered Sequence¶
GetItem from set
is impossible. set
is unordered data structure:
>>> data = {'a', 'b', 'c', 'd'}
>>>
>>> data[0]
Traceback (most recent call last):
TypeError: 'set' object is not subscriptable
>>> data[1]
Traceback (most recent call last):
TypeError: 'set' object is not subscriptable
>>> data[2]
Traceback (most recent call last):
TypeError: 'set' object is not subscriptable
>>> data[-0]
Traceback (most recent call last):
TypeError: 'set' object is not subscriptable
>>> data[-1]
Traceback (most recent call last):
TypeError: 'set' object is not subscriptable
>>> data[-2]
Traceback (most recent call last):
TypeError: 'set' object is not subscriptable
GetItem from frozenset
is impossible. frozenset
is unordered data structure:
>>> data = frozenset({'a', 'b', 'c', 'd'})
>>>
>>> data[0]
Traceback (most recent call last):
TypeError: 'frozenset' object is not subscriptable
>>> data[1]
Traceback (most recent call last):
TypeError: 'frozenset' object is not subscriptable
>>> data[2]
Traceback (most recent call last):
TypeError: 'frozenset' object is not subscriptable
>>> data[-0]
Traceback (most recent call last):
TypeError: 'frozenset' object is not subscriptable
>>> data[-1]
Traceback (most recent call last):
TypeError: 'frozenset' object is not subscriptable
>>> data[-2]
Traceback (most recent call last):
TypeError: 'frozenset' object is not subscriptable
3.6.6. Nested Sequence¶
Get elements from list
of list
:
>>> data = [[1, 2, 3],
... [4, 5, 6],
... [7, 8, 9]]
...
>>> data[0][0]
1
>>> data[0][1]
2
>>> data[0][2]
3
>>> data[1][0]
4
>>> data[1][1]
5
>>> data[1][2]
6
>>> data[2][0]
7
>>> data[2][1]
8
>>> data[2][2]
9
Get elements from list
of tuple
:
>>> data = [(4.7, 3.2, 1.3, 0.2, 'setosa'),
... (7.0, 3.2, 4.7, 1.4, 'versicolor'),
... (7.6, 3.0, 6.6, 2.1, 'virginica')]
...
>>> data[0]
(4.7, 3.2, 1.3, 0.2, 'setosa')
>>> data[0][0]
4.7
>>> data[0][4]
'setosa'
>>> data[1]
(7.0, 3.2, 4.7, 1.4, 'versicolor')
>>> data[1][0]
7.0
>>> data[1][4]
'versicolor'
>>> data[2]
(7.6, 3.0, 6.6, 2.1, 'virginica')
>>> data[2][0]
7.6
>>> data[2][4]
'virginica'
Get elements from list of sequences:
>>> data = [[1, 2, 3],
... (4, 5, 6),
... {7, 8, 9}]
...
>>> data[0]
[1, 2, 3]
>>> data[0][0]
1
>>> data[0][1]
2
>>> data[0][2]
3
>>> data[1]
(4, 5, 6)
>>> data[1][0]
4
>>> data[1][1]
5
>>> data[1][2]
6
>>> data[2] == {7, 8, 9}
True
>>> data[2][0]
Traceback (most recent call last):
TypeError: 'set' object is not subscriptable
3.6.7. Assignments¶
"""
* Assignment: Sequence GetItem Select
* Complexity: easy
* Lines of code: 10 lines
* Time: 8 min
English:
1. Use data from "Given" section (see below)
2. Non-functional requirements:
a. Use only indexes (`getitem`)
b. Do not use `str.split()`, `slice`, `for`, `while` or any other control-flow statement
c. All tests must pass
3. Write header (row with index 0) to `header: tuple` variable
4. Create `result: list`
5. Select row at index 2, convert it to `list` and add to `result`
6. Select row at index 4, convert it to `tuple` and add to `result`
7. Select row at index -2, convert it to `set` and add to `result`
8. Select row at index -4, convert it to `frozenset` and add to `result`
9. Append to `result`: empty `list`, empty `tuple`, empty `set` and empty `frozenset`
10. Compare result with "Tests" section (see below)
Polish:
1. Użyj danych z sekcji "Given" (patrz poniżej)
2. Wymagania niefunkcjonalne:
a. Korzystaj tylko z indeksów (`getitem`)
b. Nie używaj `str.split()`, `slice`, `for`, `while` lub jakiejkolwiek innej instrukcji sterującej
c. Wszystkie testy muszą przejść
3. Zapisz nagłówek (wiersz o indeksie 0) do zmiennej `header: tuple`
4. Stwórz `result: list`
5. Wybierz wiersz o indeksie 2, przekonwertuj go do `list` i dodaj do `result`
6. Wybierz wiersz o indeksie 4, przekonwertuj go do `tuple` i dodaj do `result`
7. Wybierz wiersz o indeksie -4, przekonwertuj go do `set` i dodaj do `result`
8. Wybierz wiersz o indeksie -2, przekonwertuj go do `frozenset` i dodaj do `result`
9. Dodaj na koniec `result`: pustą `list`, pustą `tuple`, pusty `set`, pusty `frozenset`
10. Porównaj wyniki z sekcją "Tests" (patrz poniżej)
Tests:
>>> import sys
>>> sys.tracebacklimit = 0
>>> assert result is not Ellipsis, 'Assignment solution must be in `result` instead of ... (Ellipsis)'
>>> assert type(header) is tuple, 'Variable `header` has invalid type, should be tuple'
>>> assert type(result) is list, 'Variable `result` has invalid type, should be list'
>>> assert len(result) == 8, 'Variable `result` length should be 8'
>>> ('sepal_length' not in result
... and 'sepal_width' not in result
... and 'petal_length' not in result
... and 'petal_width' not in result
... and 'species' not in result)
True
>>> header
('Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Species')
>>> [5.1, 3.5, 1.4, 0.2, 'setosa'] in result
True
>>> (6.3, 2.9, 5.6, 1.8, 'virginica') in result
True
>>> {1.3, 2.8, 4.1, 5.7, 'versicolor'} in result
True
>>> frozenset({1.5, 3.2, 4.5, 6.4, 'versicolor'}) in result
True
>>> list() in result
True
>>> tuple() in result
True
>>> set() in result
True
>>> frozenset() in result
True
"""
# Given
DATA = [
('Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Species'),
(5.8, 2.7, 5.1, 1.9, 'virginica'),
(5.1, 3.5, 1.4, 0.2, 'setosa'),
(5.7, 2.8, 4.1, 1.3, 'versicolor'),
(6.3, 2.9, 5.6, 1.8, 'virginica'),
(6.4, 3.2, 4.5, 1.5, 'versicolor'),
(4.7, 3.2, 1.3, 0.2, 'setosa'),
]
header = ... # tuple with row with index 0
result = ... # list
result # append list from DATA with index 2
result # append tuple from DATA with index 4
result # append set from DATA with index -4
result # append frozenset DATA with index -2
result # append empty list
result # append empty tuple
result # append empty set
result # append empty frozenset